算法实现注意事项: 1、对于小端系统,a、b、c、d的初始值为: a = 0x67452301 b = 0xEFCDAB89 c = 0x98BADCFE d = 0x10325476 2、填充到待加密信息末尾的填充前长度是以bit为单位的。比如填充前信息长度(也就是待加密信息的长度)为1Bytes,那么需要填充的值是8,而不是1。我在编码过程中就在这里摔过大马爬,-,.-。 3、在进行主循环的运算时,如果上一次的计算结果为A、B、C、D。那么运算的前后应该如下这样: unsigned int a = 0, b = 0, c = 0, d = 0;
a = A; b = B; c = C; d = D; a、b、c、d进入主循环进行运算,在运算过程中它们的值会改变。 A += a; B += b; C += c; D += d; 新的A、B、C、D才是这次的运算结果,而不是a、b、c、d,-,.-。(好吧,我承认,当时我还把a、b、c、d保存起来作为下一次的运算结果,-,.-) 4、在主循环中,FF()、GG()、HH()、II()函数中的移位操作是循环左移!而不是左移,-,.-。 5、如果填充前的待加密信息总长度(Bytes)对64求余的结果正好是56,那还需不需要填充那个0x80和无数个0x00?回答是肯定的。实际情况是,填充一个0x80,然后填充63个0x00,最后再填充8Bytes的填充前长度(bits)。看起来像没事儿找事儿,不过这确实是必要的,-,.-。 md5算法实现源码.rar