MD5算法过程
对MD5算法简要的叙述可以为:MD5以
512
位分组来处理输入的信息,且每一分组又被划分为
16
个
32
位子分组,经过了一系列的处理后,算法的输出由四个
32
位分组组成,将这四个
32
位分组级联后将生成一个
128
位散列值。
第一步、填充:如果输入信息的长度(bit)对
512
求余的结果不等于
448
,就需要填充使得对
512
求余的结果等于
448
。填充的方法是填充一个
1
和n个
0
。填充完后,信息的长度就为N
*
512
+
448
(bit);
第二步、记录信息长度:用
64
位来存储填充前信息长度。这
64
位加在第一步结果的后面,这样信息长度就变为N
*
512
+
448
+
64
=
(N
+
1
)
*
512
位。
第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A
=
(
01234567
)
16
,B
=
(
89ABCDEF
)
16
,C
=
(FEDCBA98)
16
,D
=
(
76543210
)
16
)。如果在程序中定义应该是:
(A
=
0X67452301L
,B
=
0XEFCDAB89L
,C
=
0X98BADCFEL
,D
=
0X10325476L
)。有点晕哈,其实想一想就明白了。
第四步、四轮循环运算:循环的次数是分组的个数(N
+
1
)
1
)将每一
512
字节细分成
16
个小组,每个小组
64
位(
8
个字节)
2
)先认识四个线性函数(&是与,|是或,~是非,^是异或)
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))
1
2
3
4
3
)设Mj表示消息的第j个子分组(从
0
到
15
),<<
FF(a,b,c,d,Mj,s,ti)表示a
=
b
+
((a
+
F(b,c,d)
+
Mj
+
ti)<<<s)
GG(a,b,c,d,Mj,s,ti)表示a
=
b
+
((a
+
G(b,c,d)
+
Mj
+
ti)<<<s)
HH(a,b,c,d,Mj,s,ti)表示a
=
b
+
((a
+
H(b,c,d)
+
Mj
+
ti)<<<s)
II(a,b,c,d,Mj,s,ti)表示a
=
b
+
((a
+
I(b,c,d)
+
Mj
+
ti)<<<s)
1
2
3
4
4
)四轮运算
第一轮
a
=
FF(a,b,c,d,M0,
7
,
0xd76aa478
)
b
=
FF(d,a,b,c,M1,
12
,
0xe8c7b756
)
c
=
FF(c,d,a,b,M2,
17
,
0x242070db
)
d
=
FF(b,c,d,a,M3,
22
,
0xc1bdceee
)
a
=
FF(a,b,c,d,M4,
7
,
0xf57c0faf
)
b
=
FF(d,a,b,c,M5,
12
,
0x4787c62a
)
c
=
FF(c,d,a,b,M6,
17
,
0xa8304613
)
d
=
FF(b,c,d,a,M7,
22
,
0xfd469501
)
a
=
FF(a,b,c,d,M8,
7
,
0x698098d8
)
b
=
FF(d,a,b,c,M9,
12
,
0x8b44f7af
)
c
=
FF(c,d,a,b,M10,
17
,
0xffff5bb1
)
d
=
FF(b,c,d,a,M11,
22
,
0x895cd7be
)
a
=
FF(a,b,c,d,M12,
7
,
0x6b901122
)
b
=
FF(d,a,b,c,M13,
12
,
0xfd987193
)
c
=
FF(c,d,a,b,M14,
17
,
0xa679438e
)
d
=
FF(b,c,d,a,M15,
22
,
0x49b40821
)
5
)每轮循环后,将A,B,C,D分别加上a,b,c,d,然后进入下一循环。
*
主要的操作,四轮循环