md5算法的简单描述可以如下:md5处理512位数据包中的输入信息,每个数据包分为16个32位的子数据包。经过一系列处理后,该算法的输出由四个32位数据包组成,这些数据包将被级联以生成一个128位哈希值。
在md5算法中,首先需要填充信息,使得512字节的余数的结果等于448。因此,信息的比特长度将扩展到n*512 448,即n*64 56字节,其中n是正整数。填充方法如下:在信息后面填充一个1和无数个0,在满足上述条件之前,停止用0填充信息。然后,将64位二进制形式的预填充信息长度附加到该结果上。经过这两步,当前信息字节长度=n * 512 448 64=(n ^ 1)* 512,也就是长度只是512的整数倍。这样做的原因是为了满足后期处理对信息长度的要求。
Md5有四个32位整数参数,称为chaining variable,它们是:a=0x01234567,b=0x89abcdef,c=0xedcba98,d=0x76543210。
当这四个链接变量被设置时,算法的四轮循环操作开始。周期数是信息中512位信息包的数量。
将以上四个链接变量复制到其他四个变量中:A到A,B到B,C到C,D到D。
主循环有四轮(md4只有三轮),每一轮都很相似。第一轮16次操作。每次对A、B、C、D三个做一个非线性函数运算,然后把第四个变量、文本的一个子群、一个常数加到结果上。然后,将结果向右循环移位一个不定数,并加上A、B、C或D中的一个。最后,用结果替换A、B、C或D中的一个。
以下是每个操作中使用的四个非线性函数(每轮一个)。
f(x,y,z)=(xy)|(~ x)z)
g(x,y,z)=(xz)|(y(~z))
h(x,y,z)=x^y^z
i(x,y,z)=y^(x|(~z)
(是和,|是或,~否,异或)
这四个函数的解释:如果X,Y,Z对应的位是独立一致的,那么结果的每一位也应该是独立一致的。
f是按位运算的函数。也就是说,如果x,那么y,否则z。函数h是一个逐位奇偶运算符。
假设mj代表消息的jth子分组(从0到15),