关于MD5怎样实现的这篇博客讲的很详细和容易理解,我就不再进行搬砖了,也感谢原作者的分享
https://blog.csdn.net/hla199106/article/details/45129963#commentBox
补充:
这篇博客虽然讲解实现过程中的算法很详细,但却中间漏掉了关于原文件如何进行分组,和为什么要在算法的一开始对文件数据进行填充,看完博客发现这个问题,查阅资料后决定写下本文来解决这个问题
MD5算法在开始前需要对数据进行填充,填充目的是要使文件的位长度正好是512的整数次倍,但填充分为两部分,一部分是使用一个1开头的位和多个0进行补充的位来填充到文件数据位长度达到N*512+448的数据长度,N为整数,由文件数据长度决定,为什么这里是448位的余数呢?
因为在填充完1和0之后,我们还需要在填充结果后面填充一个64位的表示文件信息长度(单位bit)的数据,加起来是N*512+448+64=(N+1)*512这正好是512的整数倍,也为后面分组进行了铺垫
在引用的博客中提到初始化变量这说明了这是一组128位的数据,分别为A,B,C和D表示,它们每一个表示的数据刚好是32位,MD5算法实现过程中需要加上原文分组的某一段,这正好是512个位,所以从这我们可以看出为什么需要原文的位长度是512的整数倍,因为我们需要按512位对它进行分组,对每一组在进行算法实现,这正是文中没有提到的一点