算法描述:
消息输入长度不大于2^64,经过预处理,每个消息分组长度为512bit。并将每个消息分组512bit分割成16个32位,标识为M0,M1……M15。经过压缩函数,MD5的算法最后会输出4个32bit级联组成的128bit的消息摘要。
详细步骤:
1.消息填充:
MD5算法首先对输入的数据进行补位,使得数据位长度对512求余的结果是448,即数据扩展至:Kx512+448 bit
其中,K为整数。
补位操作如下:在数据后面先补一个1,然后补若干个0直至满足上述要求。
例如,输入消息为abc,将其转换成字符串表示为:
0110_0001 0110_0010 0110_0011
然后进行如下补位操作:
0110_0001 0110_0010 0110_0011 1000_0000 ……(补423个0)
24+1+423 = 448bit
将补位后的结果和最后的64bit的消息长度组成的二进制转换成16进制表示:
2.初始变量
A= 0x1234567;B= 0x89abcdef ; C=0xfedcba98; D=0x76543210 ;
注意这里的是低字节在前、高字节在后的小端存储表示。
3.压缩循环
主循环有4轮,每一轮有16次操作。
FF(a ,b ,c ,d ,Mj ,s ,ti ) 操作为 a = b + ( (a + F(b,c,d) + Mj + ti) << s)
GG(a ,b ,c ,d ,Mj ,s ,ti ) 操作为 a = b + ( (a + G(b,c,d) + Mj + ti) << s)
HH(a ,b ,c ,d ,Mj ,s ,ti) 操作为 a = b + ( (a + H(b,c,d) + Mj + ti) << s)
II(a ,b ,c ,d ,Mj ,s ,ti) 操作为 a = b + ( (a + I(b,c,d) + Mj + ti) << s)