1.简介
MD5消息摘要算法是Ron Rivest开发的。MD5实际上根源于一系列消息的摘要算法。原先的消息摘要算法称为MD,很快进入下一版MD2,但很脆弱。因此,Ron Rivest开始开发MD3,结果失败了。后来,开发了MD4,但其结果还是很不理想,因此最终推出了MD5。 MD5速度很快,产生128位消息摘要。经过初始处理后,输入文本变成512位块,进一步分为16个32位块。这个算法的输出是4个32位块构成的集合,形成128位消息摘要。
2.MD5工作原理
2.1填充 MD5的第一步实在初始消息中增加填充位,目的使初始消息长度等于一个值,即比512位的倍数少64位。例如,如果初始消息长度为1000位,则要填充472位,使消息长度为1472位,因为1472+64=1536,是512的倍数。 这样,填充后,初始消息的长度为448位(比512少64位)、960位(比1024少64位)、1472位(比1536少64位),等等。 填充对用一个1位和多个0位。注意,填充总是要进行的,即使消息长度已经是比512的倍数少64。因此,如果消息长度已经是448位,则要填充512位,是长度变成960位,因此,填充长度为1~ 512位的值。 2.2添加长度 添加填充位后,下一步要计算消息原长,将其加进填充后的消息末尾。其工作流程如下:先计算消息长度,不包括填充位(即增加填充位前的长度)。例如,如果初始消息为1000位,则填充472位,使其变成比512的倍数少64位,但长度为1000,而不是1472。 这个消息原长表示为64位值,添加到加进填充后的消息末尾,如下图所示: 这是消息的长度为512位的倍数。注意,如果消息长度超过
2
64
2^{64}
2 6 4 位,即64位无法表示,因为消息太长,则只用长度的低64位,即等于计算length mod
2
64
2^{64}
2 6 4 。 2.3 将输入分成512位的块 下面要将输入分成512位的块,如下图所示: 2.4 初始链接变量 这一步要初始化4个链接变量,分别称为A、B、C、D,都是32位数字。这些链接变量都是初始十六进制值,如下表所示:
链接变量 十六进制值 A 01 23 45 67 B 89 AB CD EF C FE DC BA 98 D 76 54 32 10
2.5 处理块 初始化之后,就要开始实际的算法,这是一个循环,对消息中的多个512位块运行。其步骤如下: 第一步:将4个链接变量复制到4个变量a、b、c、d中,使a=A、b=B、c=C、d=D。实际上,这个算法将a、b、c、d组合成128位寄存器(abcd),寄存器(abcd)在实际算法运算中保存中间结果和最终结果,如下图所示: 第二步:将当前的512位块分解为16个子块,每个子块为32位。 第三步:这时有4轮,每一轮处理一个块的16位,每一轮的输入如下:(a)16个子块;(b)变量a、b、c、d;(c)常量t,如下图所示: 这4轮的第一步进行不同处理(即处理P处理bcd),其他步骤是相同的。每一轮有16个输入子块M[0],M[1],…,M[15],或表示为M[i],其中i位0~ 15,每个子块为32位。t是个常量数组,包含64个元素,每个元素32位。把数组t的元素表示为t[1],t[2],…,t[64],或t[k],其中k为1~64,由于有四轮,因此每一轮使用t值中的16个。 下面总结这四轮的迭代,每一轮的输出的中间和最终结果复制到寄存器abcd中,注意,每一轮有16个寄存器。 (1)处理P首先处理b、c、d。这个处理P在四轮中不同。 (2)变量a加进处理P的输出(即寄存器abcd)。 (3)消息子块M[i]加进第2步输出(即寄存器abcd)。 (4)常量t[k]加进第3步输出(即寄存器abcd)。 (5)第4步的输出(即寄存器abcd内容)循环左移S位(S值不断改变)。 (6)变量b加进第5步输出(即寄存器abcd)。 (7)第6步输出成为下一步的新abcd。 下图显示了MD5的操作过程: 可以用数学方法表示MD5操作过程:
a
=
b
+
(
(
a
+
P
r
o
c
e
s
s
P
(
b
,
c
,
d
)
+
M
[
i
]
+
t
[
k
]
)
<
<
<
S
)
a=b+((a+Process P(b,c,d)+M[i]+t[k])<<<S)
a = b + ( ( a + P r o c e s s P ( b , c , d ) + M [ i ] + t [ k ] ) < < < S ) 其中,a、b、c、d为链接变量;Process P(P处理)为非线性运算;M[i]表示消息的第i个分组;t[k]为常量;<<<S表示循环左移S位。 2.6 处理P简介 处理P在4轮中是不同的。简单地说,处理P就是a、b、c、d的基本布尔运算,如下表所示:
轮次 处理P 1 (b AND c) OR ((NOT b) AND (b)) 3 b XOR c XOR d 2 (b AND d) OR (c AND (NOT d)) 4 c XOR (b OR (NOT d))
注:每一轮只有P处理不同,所有其他步骤都是相同的,因此每一轮中替换处理P的实际细节,其余保持不变。 2.7 四轮运算 下表显示了4轮的迭代运算:
迭代 a b c d M s t 1 a b c d M[0] 7 t[1] 2 d a b c M[1] 12 t[2] 3 c d a b M[2] 17 t[3] 4 b c d a M[3] 22 t[4] 5 a b c d M[4] 7 t[5] 6 d a b c M[5] 12 t[6] 7 c d a b M[6] 17 t[7] 8 b c d a M[7] 22 t[8] 9 a b c d M[8] 7 t[9] 10 d a b c M[9] 12 t[10] 11 c d a b M[10] 17 t[11] 12 b c d a M[11] 22 t[12] 13 a b c d M[12] 7 t[13] 14 d a b c M[13] 12 t[14] 15 c d a b M[14] 17 t[15] 16 b c d a M[15] 22 t[16]
迭代 a b c d M s t 1 a b c d M[1] 5 t[17] 2 d a b c M[6] 9 t[18] 3 c d a b M11] 14 t[9] 4 b c d a M[0] 20 t[20] 5 a b c d M[5] 5 t[21] 6 d a b c M[10] 9 t[22] 7 c d a b M[15] 14 t[23] 8 b c d a M[4] 20 t[24] 9 a b c d M[9] 5 t[25] 10 d a b c M[14] 9 t[26] 11 c d a b M[3] 14 t[27] 12 b c d a M[8] 20 t[28] 13 a b c d M[13] 5 t[29] 14 d a b c M[2] 9 t[30] 15 c d a b M[7] 14 t[31] 16 b c d a M[2] 20 t[32]
迭代 a b c d M s t 1 a b c d M[5] 4 t[33] 2 d a b c M[8] 11 t[34] 3 c d a b M11] 16 t[35] 4 b c d a M[14] 23 t[36] 5 a b c d M[1] 4 t[37] 6 d a b c M[4] 11 t[38] 7 c d a b M[7] 16 t[39] 8 b c d a M[10] 23 t[40] 9 a b c d M[13] 4 t[41] 10 d a b c M[0] 11 t[42] 11 c d a b M[3] 16 t[43] 12 b c d a M[6] 23 t[44] 13 a b c d M[9] 4 t[45] 14 d a b c M[12] 11 t[46] 15 c d a b M[15] 16 t[47] 16 b c d a M[2] 23 t[48]
迭代 a b c d M s t 1 a b c d M[0] 6 t[49] 2 d a b c M[7] 10 t[50] 3 c d a b M[14] 15 t[51] 4 b c d a M[5] 21 t[52] 5 a b c d M[12] 6 t[53] 6 d a b c M[3] 10 t[54] 7 c d a b M[10] 15 t[55] 8 b c d a M[1] 21 t[56] 9 a b c d M[8] 6 t[57] 10 d a b c M[15] 10 t[58] 11 c d a b M[16] 15 t[59] 12 b c d a M[13] 21 t[60] 13 a b c d M[4] 6 t[61] 14 d a b c M[11] 10 t[62] 15 c d a b M[2] 15 t[63] 16 b c d a M[9] 21 t[64]
其中t的取值如下表所示:
t[i] 值 t[i] 值 t[i] 值 t[i] 值 t[1] D76AA478 t[17] F61E2562 t[33] FFFA3942 t[49] F4292244 t[2] E8C7B756 t[18] C040B340 t[34] 8771F681 t[50] 432AFF97 t[3] 242070DB t[19] 265E5A51 t[35] 699D6122 t[51] AB9423A7 t[4] C1BDCEEE t[20] E9B6C7AA t[36] FDE5380C t[52] FC93A039 t[5] F57C0FAF t[21] D62F105D t[37] A4BEEA44 t[53] 655B59C3 t[6] 4787C62A t[22] 02441453 t[38] 4BDECFA9 t[54] 8F0CCC92 t[7] A8304613 t[23] D8A1E681 t[39] F6BB4B60 t[55] FFEFF47D t[8] FD469501 t[24] E7D3FBC8 t[40] BEBFBC70 t[56] 85845DD1 t[9] 698098D8 t[25] 21E1CDE6 t[41] 289B7EC6 t[57] 6FA87E4F t[10] 8B44F7AF t[26] F4D50D87 t[42] EAA127FA t[58] FE2CE6E0 t[11] FFFF5BB1 t[27] F4D50D87 t[43] D4EF3085 t[59] A3014314 t[12] 895CD7BE t[28] 455A14ED t[44] 04881D05 t[60] 4E0811A1 t[13] 6B901122 t[29] A9E3E905 t[45] D9D4D039 t[61] F7537E82 t[14] FD987193 t[30] FCEFA3F8 t[46] E6DB99E5 t[62] BD3AF235 t[15] A679438E t[31] 676F02D9 t[47] 1FA27CF8 t[63] 2AD7D2BB t[16] 49B40821 t[32] 8D2A4C8A t[48] C4AC5665 t[64] BE86D391
3.MD5与MD4
下表表示了MD5和MD4的关键差别:
特性 MD4 MD5 轮数 3 4 常量t的使用 所有迭代中相同 所有迭代中不同 第2轮的处理P (b AND d) OR (b AND d) OR (c AND d) (b AND d) OR (c AND (NOT d)),更随机
此外,第2轮和第3轮访问子块的顺序也发生了改变,引入了更大的随机性。