Step1:对原文进行数据填充,使消息的长度对512取模得448。
设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。
填充方法:在原文后面进行填充,填充第一位为1,其余为0。
Step2:添加消息长度,在第一步结果之后再填充上原消息的长度,可用来进行储存的长度为64位(512-448)。如果消息长度大于2^64,则只使用其低64位的值(即消息长度对2^64取模)。在此步骤进行完毕后,最终消息长度就是512的整数倍。
Step3:设置初始值,MD5的散列值长度位128位,按每32位分成一组,一共4组。这4组的结果是由4个初始值A、B、C、D经过多轮(轮数由输入的信息长度决定)不断演变得到。MD5的官方实现中,A、B、C、D的初始值如下:
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x765432105
Step4:循环运算,绿色F代表四种MD5官方定义的非线形函数
F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =X^Y^Z•I(X, Y, Z)=Y^(X|(~Z))
&按位与运算符:1010b&1100b的值为1000b
| 按位或运算符:1010b | 1100b的值为1110b
^按位异或运算符:1010b^1100b的值为0110b
~按位取反运算符:~1010b的值为0101b
Mi是第一步处理后的原文。在第一步中,处理后原文的长度是512的整数倍。把原文的每512位再分成16等份,命名为M0~M15,每一等份长度32。在64次子循环中,每16次循环,都会交替用到M0~M15之一。
Ki一个常量,在64次子循环中,每一次用到的常量都是不同的。
<<<s:
FF(a, b, c, d, Mj, si, Ki) 01~16轮
GG(a, b, c, d, Mj, si, Ki) 17~32轮
HH(a, b, c, d, Mj, si, Ki) 33~48轮
II(a, b, c, d, Mj, si, Ki) 49~64轮
其中XX (a, b, c, d, Mj, si, ti)定义为:a = b + ( (a + X(b, c, d) + Mj + Ki) << si)
<<为移位操作现代密码