MD5 是 Message-Digest Algorithm 信息摘要算法的简写,是一种无密钥的迭代 hash 算法。OpenJDK 中 MD5 的实现类 org.bouncycastle.crypto.digests.MD5Digest,《Handbook of Applied Cryptography》 这本书的第 346 - 347 对 MD5 算法进行了详细的描述。
MD4 算法详解
在介绍 MD5 之前我们首先来介绍下 MD4算法,虽然 MD4 算法已经不再安全,但是 MD4 算法是大部分 hash 算法的基础,MD5 也是在 MD4 算法的基础上做了一些优化而来的。
MD4 算法输入是任意长度的数据,得到的结果是 128bit 的哈希值。算法处理流程如下:
“2.预处理”部分我们在上一篇文章中已经讲了。数据安全之散列函数(二)- 数据分组与数据填充。
MD4 每个分块分块大小为 512bit ,经过预处理后,会得到一组 512bit 长度的数据块 x 1 , x 2 . . . x n x_1,x_2...x_n x1,x2...xn。
“3.迭代处理”部分的,就是循环将 x n x_n xn 和上一轮的结果进行计算得到新的结果。
初始向量(IV)
我们在第一轮计算的时候还没有上一轮的数据怎么办?这时候就要定义一组初始的数据,用于第一轮计算。这组数据就叫做初始向量(IV)。MD4 中定义如下,每个数据 32bit 总共 128bit:
h 1 = 0 x 67452301 h_1 = 0x67452301 h1=0x67452301,
h 2 = 0 x e f c d a b 89 h_2 = 0xefcdab89 h2=0xefcdab89,
h 3 = 0 x 98 b a d c f e h_3 = 0x98badcfe h3=0x98badcfe,
h 4 = 0 x 10325476 h_4 = 0x10325476 h4=0x10325476
数据分块
首先我们来看第一块 512bit 数据的操作。每一块数据被切分成 16 个 32bit 的小块。这 16 个 32bit 的数据我们定义为 X X X, 如 X [ 0 ] X[0] X[0]就代表下面第 0 块的数据。
定义常量
再来定义 3 组常量,后面计算中会用到:
- 定义 32-bit 附加值常量 y y y:
y [ j ] = 0 , 0 ≤ j ≤ 15 y[j] = 0, 0 ≤ j ≤ 15 y[j]=0,0≤j≤15;