1. 背景
文中所列出的推薦算法皆已經(jīng)過全世界密碼學(xué)家驗證和各國際標準化組織認證, 并在市場中廣泛應(yīng)用, 有望在未來足夠長的時間內(nèi)保證安全性和實現(xiàn)性能。
2. 密碼學(xué)家的工具箱
2.1 散列算法
散列算法是密碼學(xué)算法中非常重要的一個分支, 通過對所有數(shù)據(jù)提取指紋信息以實現(xiàn)數(shù)據(jù)簽名、 數(shù)據(jù)完整性校驗等功能。 用于消息唯一性和數(shù)據(jù)完整性驗證的散列函數(shù), 其安全性依賴于函數(shù)本身的屬性和對抗碰撞的抵抗, 因此散列函數(shù)的選擇至關(guān)重要。
- MD 系列函數(shù)已宣告破解, 可被輕易偽造, 不能作為安全散列函數(shù)使用。
- SHA 安全加密標準是至今世界上使用最廣泛的散列算法之一。 SHA1 已宣告破解。 考慮性能消耗與安全性的平衡, SHA2 系列算法得到了廣泛的認可及應(yīng)用。 SHA3 作為下一代安全加密標準, 將會在未來發(fā)揮重要的作用。
- RIPEMD 是為了彌補 MD 系列算法的缺陷而由提出的算法, 比特幣生成地址過程中使用了 RIPEMD160, 雖然 RIPEMD160 還未宣告破解, 但已被證明密碼強度較弱, 不推薦使用
- Tiger 算法號稱最快的 Hash 算法, 專門針對 64 為機器做優(yōu)化了。
- Whirlpool 算法被列入 iso 標準。 與 AES 加密標準使用了相同的轉(zhuǎn)化技術(shù), 極大提高了安全性, 被稱為最安全的摘要算法。


2.2 消息認證算法
消息認證碼可以確認自己受到的消息是否是發(fā)送者的本意, 是密碼學(xué)的重要工具之一。
- CMAC 是基于分組加密的消息認證碼, 一般用作消息的簽名。 CMAC-AES128 常用于模塊內(nèi)部實現(xiàn)密鑰的派生, 將一個 AES 密鑰經(jīng)過 CMAC 產(chǎn)生多個輸出, 這些輸出可以用于不同用途的秘鑰。
- HMAC 是一種使用散列函數(shù)構(gòu)造消息認證碼的方法, 任何高強度的散列函數(shù)都可以用于 HMAC。
- PBKDF2 是一種使用偽隨機函數(shù)接受明文和 salt 作為輸入, 輸出的散列值作為輸入重新進行散列, 循環(huán)該過程上千次, 最終生成一個難以破解的密文的算法。

2.3 對稱加密算法
數(shù)據(jù)加解密技術(shù)是網(wǎng)絡(luò)中最基本的安全技術(shù), 主要是通過對網(wǎng)絡(luò)中傳輸?shù)男畔⑦M行數(shù)據(jù)加密來保障其安全性。 對稱加密算法中加密和解密使用相同的密鑰。
- SM 是國密算法, SM1 不公開, 以 IP 核形式存儲在芯片中, SM4 用于無線局域網(wǎng)中。
- RC4 算法由 RSA 公司提出, 是一種在電子信息領(lǐng)域的常用加密手段, 但已宣告破解。
- DES 算法受美國安全局資助由 IBM 開發(fā), 已宣告破解退出歷史舞臺, 盡管 3DES 目前還在被一些機構(gòu)使用, 但其處理速度不高, 除了特別要求向下兼容, 很少被用于新的用途。
- AES 由美國國家標準技術(shù)研究所組織競選, 目的是取代 DES 成為新一代美國國家標準, 但參與競選的算法都有一個條件: 被選為 AES 的密碼算法必須無條件地免費供全世界使用。 因此 AES 也是一個世界性的標準。 最終 Rijndael 被選為新一代高級加密標準, 但同期競選亦不乏優(yōu)異的算法, 一并推薦。
- Camellia 是一種為許多組織所推崇的分組密碼, 由三菱和日本電信電話(NTT) 在2000 年共同發(fā)明, 雖然受到專利保護, 但在 2001 年時 NTT 宣布 Camellia 為 Royalty-freelicense。



2.5 非對稱加密算法
非對稱加密技術(shù)中加密和解密使用不同的密鑰, 已知密碼算法和加密密鑰, 求解密密鑰在計算上是不可行的。
- RSA 是最常見的非對稱加密算法, 即能用于數(shù)據(jù)加密, 也能用于數(shù)字簽名, 是目前最流行的公開密鑰算法。 隨著分解大整數(shù)方法的進步及完善, 密鑰長度的增加導(dǎo)致了其加解密的速度大為降低, 硬件實現(xiàn)也變得越來越難以忍受, 這對使用 RSA 的應(yīng)用帶來了很重的負擔, 因此需要一種新的算法來代替 RSA。
- ECC 根據(jù)是有限域上的橢圓曲線上的點群中的離散對數(shù)問題 ECDLP。 ECDLP 是比因子分解問題更難的問題, 它是指數(shù)級的難度。
- SM2 是一種橢圓曲線公鑰密碼算法, SM2 算法相對 RSA 是一種更先進安全的算法, 在國家商用密碼體系中被用來替換 RSA 算法。
- ElGamal 加密算法是一個基于 Diffie-Hellman 密鑰交換的非對稱加密算法。
- Rabin 算法是目前主流的基于概率的素數(shù)測試算法, 在構(gòu)建密碼安全體系中占有重要的地位。

2.6 數(shù)字簽名算法
數(shù)字簽名是一種以電子形式存在于數(shù)據(jù)信息之中的, 或作為其附件或邏輯上有聯(lián)系的數(shù)據(jù), 可用于辨別數(shù)據(jù)簽署人的身份, 并表名簽署人對數(shù)據(jù)信息中包含的信息的認可技術(shù)。 在我國, 數(shù)字簽名是具法律效力的, 正在被普遍使用。 數(shù)字簽名能夠?qū)崿F(xiàn)鑒權(quán), 保證數(shù)據(jù)的完整性, 以及確保消息的發(fā)送方不可抵賴。
- DSA 是美國國家標準技術(shù)研究所指定的數(shù)字簽名標準算法, 但其生成簽名的隨機性較差, 存在被攻破的風(fēng)險, 不推薦使用
- RSA 簽名算法是最常用的簽名算法之一, 其被簽名的消息、 密鑰以及最終生成的簽名都是以數(shù)字形式表示的, 因此在對文本進行簽名時, 需要事先對文本編碼成數(shù)字。
- ECDSA 是使用橢圓曲線密碼實現(xiàn)的數(shù)字簽名算法。 ECDSA 于 1999 年成為 ANSI 標準,并于 2000 年成為 IEEE 和 NIST 標準, 在資源消耗及安全強度上相對于 RSA 簽名算法都更有優(yōu)勢。
- ElGamal 簽名算法是在密碼協(xié)議中有著重要應(yīng)用的一類公鑰密碼算法, 其安全性是基于有限域上離散對數(shù)學(xué)問題的難解性。 它至今仍是一個安全性良好的公鑰密碼算法, DSA算法即是 ElGamal 算法的派生。
-
Rabin 簽名算法是一種基于模平方和模平方根的簽名算法, 難度近似于大素數(shù)分解,但在實際使用中相對較少, 不做推薦。
數(shù)字簽名算法
3. 常用密碼工具
Java Javax.crypto、 org.bouncycastle
C++ Boost C++ Libraries、 Crypto++ Library
Python cryptography、 PocketProtector
Go crypto、 golang.org/x/crypto/
JavaScript crypto.js
OpenSSL
參考文獻
[1] 國家密碼管理局公告(第 7 號) 2006-01-19
[2] M.Bellare, New Proofs for NMAC and HMAC: Security Without CollisionResistance, Journal of Cryptology 28(4): 844-878 (2015).CRYPTREC Report 2007, 2008 年 3 月
[3] http://www.cryptrec.go.jp/report/c07_wat_final.pdf
[4] https://en.bitcoin.it/wiki/Secp256k1
[5] Douglas R.Stinson. 密碼學(xué)原理與實踐(第三版) 電子工業(yè)出版社 2009
[6] https://en.bitcoin.it/wiki/Elliptic_Curve_Digital_Signature_Algorithm
[7] Michael E.Whitman 信息安全原理(第五版) 清華大學(xué)出版社
[8] Secp256k1 https://en.bitcoin.it/wiki/Secp256k1
[9] Java ? Cryptography Architecture Standard Algorithm Name Documentation
https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#Signature
[10] RSA ECC 比較 https://blog.csdn.net/caodongfang126/article/details/83377888.
[11] SM 系列國密算法 http://www.itdecent.cn/p/ac68b13d087f
