1. 背景
文中所列出的推荐算法皆已经过全世界密码学家验证和各国际标准化组织认证, 并在市场中广泛应用, 有望在未来足够长的时间内保证安全性和实现性能。
2. 密码学家的工具箱
2.1 散列算法
散列算法是密码学算法中非常重要的一个分支, 通过对所有数据提取指纹信息以实现数据签名、 数据完整性校验等功能。 用于消息唯一性和数据完整性验证的散列函数, 其安全性依赖于函数本身的属性和对抗碰撞的抵抗, 因此散列函数的选择至关重要。
- MD 系列函数已宣告破解, 可被轻易伪造, 不能作为安全散列函数使用。
- SHA 安全加密标准是至今世界上使用最广泛的散列算法之一。 SHA1 已宣告破解。 考虑性能消耗与安全性的平衡, SHA2 系列算法得到了广泛的认可及应用。 SHA3 作为下一代安全加密标准, 将会在未来发挥重要的作用。
- RIPEMD 是为了弥补 MD 系列算法的缺陷而由提出的算法, 比特币生成地址过程中使用了 RIPEMD160, 虽然 RIPEMD160 还未宣告破解, 但已被证明密码强度较弱, 不推荐使用
- Tiger 算法号称最快的 Hash 算法, 专门针对 64 为机器做优化了。
- Whirlpool 算法被列入 iso 标准。 与 AES 加密标准使用了相同的转化技术, 极大提高了安全性, 被称为最安全的摘要算法。
2.2 消息认证算法
消息认证码可以确认自己受到的消息是否是发送者的本意, 是密码学的重要工具之一。
- CMAC 是基于分组加密的消息认证码, 一般用作消息的签名。 CMAC-AES128 常用于模块内部实现密钥的派生, 将一个 AES 密钥经过 CMAC 产生多个输出, 这些输出可以用于不同用途的秘钥。
- HMAC 是一种使用散列函数构造消息认证码的方法, 任何高强度的散列函数都可以用于 HMAC。
- PBKDF2 是一种使用伪随机函数接受明文和 salt 作为输入, 输出的散列值作为输入重新进行散列, 循环该过程上千次, 最终生成一个难以破解的密文的算法。
2.3 对称加密算法
数据加解密技术是网络中最基本的安全技术, 主要是通过对网络中传输的信息进行数据加密来保障其安全性。 对称加密算法中加密和解密使用相同的密钥。
- SM 是国密算法, SM1 不公开, 以 IP 核形式存储在芯片中, SM4 用于无线局域网中。
- RC4 算法由 RSA 公司提出, 是一种在电子信息领域的常用加密手段, 但已宣告破解。
- DES 算法受美国安全局资助由 IBM 开发, 已宣告破解退出历史舞台, 尽管 3DES 目前还在被一些机构使用, 但其处理速度不高, 除了特别要求向下兼容, 很少被用于新的用途。
- AES 由美国国家标准技术研究所组织竞选, 目的是取代 DES 成为新一代美国国家标准, 但参与竞选的算法都有一个条件: 被选为 AES 的密码算法必须无条件地免费供全世界使用。 因此 AES 也是一个世界性的标准。 最终 Rijndael 被选为新一代高级加密标准, 但同期竞选亦不乏优异的算法, 一并推荐。
- Camellia 是一种为许多组织所推崇的分组密码, 由三菱和日本电信电话(NTT) 在2000 年共同发明, 虽然受到专利保护, 但在 2001 年时 NTT 宣布 Camellia 为 Royalty-freelicense。
2.5 非对称加密算法
非对称加密技术中加密和解密使用不同的密钥, 已知密码算法和加密密钥, 求解密密钥在计算上是不可行的。
- RSA 是最常见的非对称加密算法, 即能用于数据加密, 也能用于数字签名, 是目前最流行的公开密钥算法。 随着分解大整数方法的进步及完善, 密钥长度的增加导致了其加解密的速度大为降低, 硬件实现也变得越来越难以忍受, 这对使用 RSA 的应用带来了很重的负担, 因此需要一种新的算法来代替 RSA。
- ECC 根据是有限域上的椭圆曲线上的点群中的离散对数问题 ECDLP。 ECDLP 是比因子分解问题更难的问题, 它是指数级的难度。
- SM2 是一种椭圆曲线公钥密码算法, SM2 算法相对 RSA 是一种更先进安全的算法, 在国家商用密码体系中被用来替换 RSA 算法。
- ElGamal 加密算法是一个基于 Diffie-Hellman 密钥交换的非对称加密算法。
- Rabin 算法是目前主流的基于概率的素数测试算法, 在构建密码安全体系中占有重要的地位。
2.6 数字签名算法
数字签名是一种以电子形式存在于数据信息之中的, 或作为其附件或逻辑上有联系的数据, 可用于辨别数据签署人的身份, 并表名签署人对数据信息中包含的信息的认可技术。 在我国, 数字签名是具法律效力的, 正在被普遍使用。 数字签名能够实现鉴权, 保证数据的完整性, 以及确保消息的发送方不可抵赖。
- DSA 是美国国家标准技术研究所指定的数字签名标准算法, 但其生成签名的随机性较差, 存在被攻破的风险, 不推荐使用
- RSA 签名算法是最常用的签名算法之一, 其被签名的消息、 密钥以及最终生成的签名都是以数字形式表示的, 因此在对文本进行签名时, 需要事先对文本编码成数字。
- ECDSA 是使用椭圆曲线密码实现的数字签名算法。 ECDSA 于 1999 年成为 ANSI 标准,并于 2000 年成为 IEEE 和 NIST 标准, 在资源消耗及安全强度上相对于 RSA 签名算法都更有优势。
- ElGamal 签名算法是在密码协议中有着重要应用的一类公钥密码算法, 其安全性是基于有限域上离散对数学问题的难解性。 它至今仍是一个安全性良好的公钥密码算法, DSA算法即是 ElGamal 算法的派生。
-
Rabin 签名算法是一种基于模平方和模平方根的签名算法, 难度近似于大素数分解,但在实际使用中相对较少, 不做推荐。
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. 密码学原理与实践(第三版) 电子工业出版社 2009
[6] https://en.bitcoin.it/wiki/Elliptic_Curve_Digital_Signature_Algorithm
[7] Michael E.Whitman 信息安全原理(第五版) 清华大学出版社
[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 系列国密算法 https://www.jianshu.com/p/ac68b13d087f
有疑问加站长微信联系(非本文作者)