本文参考《PKI/CA 与数字证书技术大全》书籍,如有理解bug, 请大家指正。
MD5
MD5 是 MD4 的改进版,以512位分组来处理输入的信息,产生128位散列值。
MD5 算法的计算过程主要包括以下步骤:
(1) 预填充
首先,对信息进行填充,使其位长对 512 求余的结果等于 448, 即信息的位长(Bits Length) 被扩展至 N x 512 + 448 或 N x 64 + 54 个字节(N 为一个正整数)。填充的方法为:在信息的后面填充一个1和多个0,直到满足上面的条件。然后,再附加一个64位二进制表示的填充前信息长度。经过这两步处理,使消息长度恰好是512位的整数倍。
(2) 主循环
主循环的次数为信息中512位分组的数目。MD5 中需要4个32位的链接变量: A = 0x01234567, B = 0x89abcdef, C = 0xfedcba98, D = 0x76543210。
每个主循环有4轮(MD4 只有 3 轮), 每轮循环都很相似, 每轮16次操作。在 主循环开始前,先将 4 个链接变量复制到另外4个变量中:A到a, B到b,C到c, D到d。第一轮进行16次操作。每次操作对 a,b,c,d其中3个进行一次非线性函数运算,然后将所得结果加上第4个变量、512位分组数据和一个常数。在将所得结果向右环移一个不定的数,并加上 a, b, c, 或 d 中的一个。最后用该结果取代 a, b, c,或 d 中之一。
每个主循环完成以后,将 A、B、C、D分别加上 a、b、c、d,然后用下一个512位分组数据继续进行主循环运算,直到所有分组都完成主循环运算。
(3) 输出处理
将最后一个主循环生成的 A、B、C、D这四个32位值进行级联,生成一个128位的摘要值。
SHA1
SHA1 是以 512 位分组来处理输入信息,产生 160 位散列值。
SHA1 算法计算过程与 MD5 类似,主要包括如下步骤。
(1) 预填充
填充方法与 MD5 完全一致。
(2) 主循环
主循环的次数为信息中512位分组的数目。SHA1 中需要5个32位的链接变量: A = 0x67452301, B = 0xefcdab89, C = 0x98badcfe, D = 0x10325476, E = 0xc3d2e1f0。
每个主循环有4轮, 每轮20次操作。在 主循环开始前,先将 5 个链接变量复制到另外5个变量中:A到a, B到b,C到c, D到d, E到e。每次操作对 a, b, c, d, e其中3个进行一次非线性函数运算,然后进行与 MD5 中类似的移位运算和加运算。
每个主循环完成以后,将 A、B、C、D、E分别加上 a、b、c、d、e,然后用下一个512位分组数据继续进行主循环运算,直到所有分组都完成主循环运算。
(3) 输出处理
将最后一个主循环生成的 A、B、C、D、E这5个32位值进行级联,生成一个160位的摘要值。
SM3
SM3 算法是由中国国家密码管理局于2012年12月17日发布的摘要算法,主要满足电子认证服务系统等应用需求。
针对长度为 l(l < 2 ^ 64)比特的消息m,SM3 算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256位。其中填充过程为:假设消息m的长度为l位。首先将位“1”添加到消息的尾未,再添加k个“0”,k 是满足 l + 1 + k = 448 mod 512 的最小的非负整数;然后在添加一个 64 位的比特串,该比特串是长度 l 的二进制表示;填充后的消息 m' 的比特长度为 512 的倍数。