在我们之前的文章中,我们探讨了MD4算法的细节。虽然在当前的技术环境下,MD4算法已经不被认为是安全的,但它仍然是现代大多数散列算法的基石。
现在广泛使用的多种散列算法都是基于MD4的原理进行改进和发展的。在本文中,我们将深入探讨MD4与其后继者MD5之间的关键差异,并详细介绍MD5算法。通过比较这两种算法,我们旨在揭示MD5如何在保持MD4核心理念的同时,增强了安全性和效率。
由于本文与上一篇密切相关,如果你还没阅读过 数据安全之散列函数(三)- MD4 原理 ,建议您先进行阅读。
计算轮数增加
计算轮次从原来的 3 轮增加到了 4 轮,既增加了
48
<
=
j
<
=
63
48<=j<=63
48<=j<=63的轮次。新的轮次的函数定义为:
第三轮函数
g
g
g改为 (B & D) | (C & ~D)。
新增第四轮函数
k
k
k为 C^ ( B | ~D)。
对常量进行变更
32-bit **附加值常量 **
y
y
y 由 2的平方根前32bit 变更为
a
b
s
(
s
i
n
(
j
+
1
)
)
,
0
≤
j
≤
63
abs(sin(j + 1)), 0 ≤ j ≤ 63
abs(sin(j+1)),0≤j≤63 的值的前 32 个 bit,其中
j
j
j 为弧度。
**原始输入值访问顺序常量 **
z
z
z :
z
[
16..31
]
=
[
1
,
6
,
11
,
0
,
5
,
10
,
15
,
4
,
9
,
14
,
3
,
8
,
13
,
2
,
7
,
12
]
z[16..31] = [1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12]
z[16..31]=[1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12]
z
[
32..47
]
=
[
5
,
8
,
11
,
14
,
1
,
4
,
7
,
10
,
13
,
0
,
3
,
6
,
9
,
12
,
15
,
2
]
z[32..47] = [5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2]
z[32..47]=[5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2]
z
[
48..63
]
=
[
0
,
7
,
14
,
5
,
12
,
3
,
10
,
1
,
8
,
15
,
6
,
13
,
4
,
11
,
2
,
9
]
z[48..63] = [0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9]
z[48..63]=[0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9]
改变替换规则
将第一轮、第二轮、第三轮中的 t 循环右移替换 A,改为循环右移加原值进行替换。
新增第四轮用
k
k
k 函数进行计算。
下一篇我们将通过代码的形式介绍 JDK 中是如何实现 MD5 的。
系列文章: