最全的加解密算法实现原理深剖
由于大学学的数学专业,自从进入密码学行业,对加解密算法的实现原理产生了深厚的兴趣,故写本系列文章对各种加解密算法原理进行深剖。
加解密算法大致分为三大类:消息摘要算法/签名算法、对称加密(加密解密密钥相同)、非对称加密。
1. 消息摘要算法/签名算法
1.1 MD系列家族
MD系列算法是信息摘要三大算法中的一种,全称:Message Digest算法,按照规范版本分为MD2、MD4、MD5三种算法,目前最常用的是MD5版本算法。
1.1.1 md2算法
1989 年,著名的非对称算法 RSA 发明人之一—麻省理工学院教授罗纳德·李维斯特(Ronald L.Rivest)开发了 MD2 算法。这个算法首先对信息进行数据补位,使信息的字节长度是 16 的倍数。再以一个 16 位的检验和作为补充信息追加到原信息的末尾。最后根据这个新产生的信息计算出一个 128 位的散列值,MD2 算法由此诞生。
有关MD2算法详情请参见RFC1319: http://www.ietf.org/rfc/rfc1319.txt
1.1.2 md4算法
1990 年,罗纳德·李维斯特教授开发出较之 MD2 算法有着更高安全性的 MD4 算法。在这个算法中,我们仍需对信息进行数据补位。不同的是,这种补位使其信息的字节长度加上 448 个字节后能成为 512 的倍数(信息字节长度 mod 512 = 448)。此外,关于 MD4 算法的处理与 MD2 算法又有很大差别。但最终仍旧是会获得一个 128 位的散列值。MD4 算法对后续消息摘要算法起到了推动作用,许多比较有名的消息摘要算法都是在 MD4 算法的基础上发展而来的,如 MD5、SHA-1、RIPE-MD 和 HAVAL 算法等。
有关MD4算法详情请参见RFC1320: http://www.ietf.org/rfc/rfc1320.txt
1.1.3 md5算法
1991年,继 MD4 算法后,罗纳德·李维斯特教授开发了 MD5 算法,将 MD 算法推向成熟。MD5 算法经 MD2、MD3 和 MD4 算法发展而来,算法复杂程度和安全强度大大提高。但不管是 MD2、MD4 还是 MD5 算法,其算法的最终结果均是产生一个 128 位的消息摘要,这也是 MD 系列算法的特点。MD5 算法执行效率略次于 MD4 算法,但在安全性方面,MD5 算法更胜一筹。随着计算机技术的发展和计算水平的不断提高,MD5 算法暴露出来的漏洞也越来越多。1996 年后被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如 SHA-2。2004 年,证实 MD5 算法无法防止碰撞(collision),因此不适用于安全性认证,如 SSL 公开密钥认证或是数字签名等用途。
有关MD5算法详情请参见RFC1321: http://www.ietf.org/rfc/rfc1321.txt
1.2 SHA系列家族
SHA (Security Hash Algorithm) 是美国的 NIST 和 NSA 设计的一种标准的 Hash 算法,SHA 用于数字签名的标准算法的 DSS 中,也是安全性很高的一种 Hash 算法。
1.2.1 sha1算法
SHA1 是第一代 SHA 算法标准,是一种安全性很高的哈希算法,也是校验算法,可用于校验文件的完整性。SHA1 可处理原始报文长度不能超过2的64次方,然后SHA1生成160位(20byte)的报文摘要。SHA1 算法简单而且紧凑,容易在计算机上实现。
SHA1 与 MD4 相比较而言,主要增加了扩展变换,将前一轮的输出也加到了下一轮,这样增加了雪崩效应,而且由于其 160 Bits 的输出,对穷举攻击更具有抵抗性。
有关SHA1算法详情请参见RFC3174: http://www.ietf.org/rfc/rfc3174.txt
1.2.2 sha2算法
SHA-2 又可以再分为六个不同的算法标准。其中包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些变体除了生成摘要的长度、循环运行的次数等一些微小差异外,算法的基本结构是一致的。
有关 SHA2 算法详情请参见 NIST.FIPS.180-4 。
1.2.2.1 sha2-224算法
1.2.2.2 sha2-256算法
1.2.2.3 sha2-384算法
1.2.2.4 sha2-512算法
1.2.2.5 sha2-512/224算法
1.2.2.5 sha2-512/256算法
1.2.3 sha3算法
SHA-3 算法是第三代标准的哈希函数,基于 Keccak 算法实现。与之前的哈希算法有所不同,SHA-3 算法是基于置换 ( permutation-based ) 的加密函数。
1.2.3.1 sha3-224算法
1.2.3.2 sha3-256算法
1.2.3.3 sha3-384算法
1.2.3.4 sha3-512算法