MD5是以512位的分组来处理输入的信息,并且将每一分组又划分成16个32 位的子分组,经过了一系列的处理后,算法的输出由四个32位的分组组成,将这 四个32位的分组结合后将生成一个128位的散列值。详细的MD5加密算法流程如 图6-13所示。
图6-13 MD5加密算法流程
下面介绍其中的关键步骤。
1.填充
在MD5算法中,首先需要将信息进行填充,使其位长对512求余后的结果等 于448 。即使符合上述条件,也必须进行填充。因此,信息的位长将被扩展至
N × 512+448 ,N是一个非负整数。计算原始消息的长度(不包含填充部分),并 且附加到填充位与消息之后。该长度值为64位二进制数表示的填充前信息的长 度。
2.信息分组
首先将数据按每512位为一组进行分组,如图6-14所示,再把每组里面分成16 个32位数据。
图6-14 将输入分组
3.初始化变量
初始化四个链接变量A 、B 、C 、D ,它们都是32位的数字,这些链接变量的 初始十六进制数值如下所示,低字节在前:
当设置好这四个链接变量后,就开始进入算法的四轮循环运算。将上面四个 链接变量复制到另外四个变量中:A到a ,B到b ,C到c ,D到d。
主循环有四轮,每轮循环都很相似,每一轮进行16次操作。每次操作对a、
b 、c和d的其中三个进行一次非线性函数运算,然后将所得结果加上第四个变量、 信息的一个子分组和一个常数,再将所得结果左移一个不确定的数,并加上a、
b 、c 、d之一。
以下是四轮循环中用到的四个非线性函数(每轮一个):
所有这些操作完成之后,将A 、B 、C 、D分别加上a 、b 、c 、d ,然后用下一 分组的数据继续运行算法,最后MD5算法产生128位的输出是A 、B 、C 、D的级 联,其中低字节始于A ,高字节终于D 。至此,整个MD5算法处理结束。