MD5 算法描述

来源:互联网 发布:经济数据分析论文 编辑:程序博客网 时间:2024/05/22 10:27
对MD5 算法的简要叙述为:MD5 以512 位分组来处理输入的信息,且每一分组又
被划分为16 个32 位子分组,经过一系列的处理后,算法的输出由4 个32 位分组组成,
将这4 个32 位分组级联后将生成一个128 位的散列值。
在MD5 算法中,首先需要对信息进行填充,使其位长度对512 求余的结果等于448。
因此,信息的位长度(Bits Length)将被扩展至N*512+448,即N*64+56 个字节(Bytes),
N 为一个正整数。填充的方法如下:
在信息的后面填充一个1 和无数个0,直到满足上面的条件时才停止用0 对信息的
填充。然后,在这个结果后面附加一个以64 位二进制表示的填充前信息长度。经过这
两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512 的整
数倍。这样做的原因是为了满足后面处理中对信息长度的要求。
MD5 中有4 个32 位被称作链接变量(Chaining Variable)的整数参数,它们分别为:
A=0x01234567, B=0x89abcdef, C=0xfedcba98, D=0x76543210。
当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息
中512 位信息分组的数目。
将上面4 个链接变量复制到另外4 个变量中: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) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(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 表示消息的第j 个子分组( 从0 到15) , FF(a,b,c,d,Mj,s,ti) 表示
a=b+((a+(F(b,c,d)+Mj+ti),GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti), HH(a,b,c,d,Mj,s,ti)表示
26
1
a=b+((a+(H(b,c,d)+Mj+ti),II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)。
这四轮(64 步)是:
第一轮
FF(a,b,c,d,M0,7,0xd76aa478)
FF(d,a,b,c,M1,12,0xe8c7b756)
FF(c,d,a,b,M2,17,0x242070db)
FF(b,c,d,a,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(d,a,b,c,M5,12,0x4787c62a)
FF(c,d,a,b,M6,17,0xa8304613)
FF(b,c,d,a,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0x698098d8)
FF(d,a,b,c,M9,12,0x8b44f7af)
FF(c,d,a,b,M10,17,0xffff5bb1)
FF(b,c,d,a,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122)
FF(d,a,b,c,M13,12,0xfd987193)
FF(c,d,a,b,M14,17,0xa679438e)
FF(b,c,d,a,M15,22,0x49b40821)
第二轮
GG(a,b,c,d,M1,5,0xf61e2562)
GG(d,a,b,c,M6,9,0xc040b340)
GG(c,d,a,b,M11,14,0x265e5a51)
GG(b,c,d,a,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(d,a,b,c,M10,9,0x02441453)
GG(c,d,a,b,M15,14,0xd8a1e681)
GG(b,c,d,a,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0x21e1cde6)
GG(d,a,b,c,M14,9,0xc33707d6)
GG(c,d,a,b,M3,14,0xf4d50d87)
GG(b,c,d,a,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(d,a,b,c,M2,9,0xfcefa3f8)
GG(c,d,a,b,M7,14,0x676f02d9)
GG(b,c,d,a,M12,20,0x8d2a4c8a)
第1 章全面剖析网络爬虫
27
第三轮
HH(a,b,c,d,M5,4,0xfffa3942)
HH(d,a,b,c,M8,11,0x8771f681)
HH(c,d,a,b,M11,16,0x6d9d6122)
HH(b,c,d,a,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(d,a,b,c,M4,11,0x4bdecfa9)
HH(c,d,a,b,M7,16,0xf6bb4b60)
HH(b,c,d,a,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0x289b7ec6)
HH(d,a,b,c,M0,11,0xeaa127fa)
HH(c,d,a,b,M3,16,0xd4ef3085)
HH(b,c,d,a,M6,23,0x04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(d,a,b,c,M12,11,0xe6db99e5)
HH(c,d,a,b,M15,16,0x1fa27cf8)
HH(b,c,d,a,M2,23,0xc4ac5665)
第四轮
II(a,b,c,d,M0,6,0xf4292244)
II(d,a,b,c,M7,10,0x432aff97)
II(c,d,a,b,M14,15,0xab9423a7)
II(b,c,d,a,M5,21,0xfc93a039)
II(a,b,c,d,M12,6,0x655b59c3)
II(d,a,b,c,M3,10,0x8f0ccc92)
II(c,d,a,b,M10,15,0xffeff47d)
II(b,c,d,a,M1,21,0x85845dd1)
II(a,b,c,d,M8,6,0x6fa87e4f)
II(d,a,b,c,M15,10,0xfe2ce6e0)
II(c,d,a,b,M6,15,0xa3014314)
II(b,c,d,a,M13,21,0x4e0811a1)
II(a,b,c,d,M4,6,0xf7537e82)
II(d,a,b,c,M11,10,0xbd3af235)
II(c,d,a,b,M2,15,0x2ad7d2bb)
II(b,c,d,a,M9,21,0xeb86d391)
常数ti 可以如下选择:
在第i 步中,ti 是4294967296*abs(sin(i))的整数部分,i 的单位是弧度(4294967296
等于2 的32 次方)。
所有这些都完成之后,将A、B、C、D 分别加上a、b、c、d。然后用下一分组数据
继续运行算法,最后的输出是A、B、C 和D 的级联。