对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。 前者的意思是不可能有任意两段明文加密以后得到相同的密文,后者的意思是如果我们加密特定的数据,得到的密文一定是相同的。
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 下面分步介绍如下:
第一步:增加填充。 增加padding使得数据长度(bit为单位)模512为448。 如果数据长度正好是模512为448,增加512个填充bit,也就是说填充的个数为1一512。第一个bit为1,其余全部为0。
第二步:补足长度。 将数据长度转换为64bit的数值,如果长度超过64bit所能表示的数据长度的范围,值保留最后64bit,增加到前面填充的数据后面,使得最后的数据为512bit的整数倍。也就是32bit的16倍的整数倍。 在RFC1321中,称为一个word。
第三步:初始化变量。 用到4个变量,分别为A、B、C、D, 均为32bit长。 初始化为:
A:01 23 45 67
B:89 ab cd ef
C:fe dc ba 98
D:76 54 32 10
第四步:数据处理。首先定义4个辅助函数:
F(X,Y,Z) = XY v not(X) Z
G(X,Y,Z) = XZ v Y not(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X v not(Z))
其中:X Y表示按位与,X v Y 表示按位或,not(X)表示按位取反,xor表示按位异或。 函数中的X、Y、Z均为32bit。定义一个需要用到的数组:T(i),i取值1一64,T(i)等于abs(sin(i))的4294967296倍的整数部分,i为弧度。 假设前三步处理后的数据长度为32*16*Nbit。
第五步:输出:最后得到的ABCD为输出结果,共128bit。 A为低位,D为高位。