MD5由美国密码学家Ronald Linn Rivest设计,于1992公开,用以取代MD4算法,在RFC 1321标准被加以规范。1996年该算法被证实存在弱点,可以被破解。2004年证实MD5无法防止碰撞,因此不适用于安全性认证。
MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
MD5协议标准:RFC 1321: The MD5 Message-Digest Algorithm
MD5算法处理分如下几步:
- 消息填充
消息填充分为两部分:第一部分是附加填充比特,第二部分是附加长度,目的是让整个消息满足指定的结构,从而处理起来可以统一化、格式化。
附加填充比特:指在消息尾部进行填充,使报文长度在对512取模后的余数为448。具体操作是:先被1比特1,然后都被0,直到满足对512取模余448。需要注意的是:即使原始消息长度已经满足对512取模余448,补位也需要进行,这时地填充512比特。所以附加填充时至少补1位,最多补512位。
附加长度:将原始数据的长度信息补到已经进行了填充的消息后面。
- 消息分组
消息分组指将消息填充后的数据按512bit进行分组。
消息填充和消息分组处理图示如下:
- 迭代运算
MD5算法对输入的消息进行4轮迭代运算,并输出128bit的HASH结果。
MD5处理过程中会用到4个哈希初值和64个哈希常量。
4个哈希初值:A=0x67452301,B=0xEFCDAB89,C=0x98BADCFE,D=0x10325476。
64个哈希常量T:
0xd76aa478 | 0xe8c7b756 | 0x242070db | 0xc1bdceee | 0xf57c0faf | 0x4787c62a | 0xa8304613 | 0xfd469501 |
0x698098d8 | 0x8b44f7af | 0xffff5bb1 | 0x895cd7be | 0x6b901122 | 0xfd987193 | 0xa679438e | 0x49b40821 |
0xf61e2562 | 0xc040b340 | 0x265e5a51 | 0xe9b6c7aa | 0xd62f105d | 0x02441453 | 0xd8a1e681 | 0xe7d3fbc8 |
0x21e1cde6 | 0xc33707d6 | 0xf4d50d87 | 0x455a14ed | 0xa9e3e905 | 0xfcefa3f8 | 0x676f02d9 | 0x8d2a4c8a |
0xfffa3942 | 0x8771f681 | 0x6d9d6122 | 0xfde5380c | 0xa4beea44 | 0x4bdecfa9 | 0xf6bb4b60 | 0xbebfbc70 |
0x289b7ec6 | 0xeaa127fa | 0xd4ef3085 | 0x04881d05 | 0xd9d4d039 | 0xe6db99e5 | 0x1fa27cf8 | 0xc4ac5665 |
0xf4292244 | 0x432aff97 | 0xab9423a7 | 0xfc93a039 | 0x655b59c3 | 0x8f0ccc92 | 0xffeff47d | 0x85845dd1 |
0x6fa87e4f | 0xfe2ce6e0 | 0xa3014314 | 0x4e0811a1 | 0xf7537e82 | 0xbd3af235 | 0x2ad7d2bb | 0xeb86d391 |
MD5迭代运算详细流程为:
哈希初值赋值:
H0=A=0x67452301,H1=B=0xEFCDAB89,H2=C=0x98BADCFE,H3=D=0x10325476
第一轮:FF(a,b,c,d,k,s,j)
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s,其中:F(b,c,d) = (b & c) | (~b & d)
第二轮:GG(a,b,c,d,k,s,j)
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s,其中:G(b,c,d) = (b & d) | (c & ~d)
第三轮:HH(a,b,c,d,k,s,j)
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s,其中:H(b,c,d) = b ⊕ c ⊕ d
第四轮:II(a,b,c,d,k,s,j)
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s,其中:I(b,c,d) = c ⊕ (b | ~d)
结果输出:
H0=H0+A,H1=H1+B,H2=H2+C,H3=H3+D