MD5简介
MD5(Message-Digest Algorithm 5) 是一种广泛使用的哈希函数,其核心功能是将任意长度的输入数据转换为固定长度的128位(16字节)哈希值,通常以32位十六进制字符串表示。
数据填充
把输入数据填充到64字节(512位)的倍数(最少填充9个字节,最多填充64+8个字节)。
填充方式:
- 在原始数据的后面填充0x80
- 填充N个0
- 使用小端序在最后8个字节填充输入数据的bit长度
分块处理
将填充后的数据分割为多个512位(64字节)的块,每个块进一步分为16个32位子块(记为M[0]
到M[15]
)。
初始化寄存器
初始化4个32位寄存器(A、B、C、D),初始值为:
1 | A = 0x67452301 |
四轮非线性变换
每个512位块会经过四轮处理(每轮16步,共64步),每轮使用不同的逻辑函数和参数
四轮逻辑函数
每轮使用不同的非线性函数(共4个):
- Round 1:
F(B, C, D) = (B ∧ C) ∨ (¬B ∧ D)
- Round 2:
G(B, C, D) = (B ∧ D) ∨ (C ∧ ¬D)
- Round 3:
H(B, C, D) = B ⊕ C ⊕ D
- Round 4:
I(B, C, D) = C ⊕ (B ∨ ¬D)
消息子块的使用顺序
每轮以不同顺序使用16个消息子块 M[k]
:
- Round 1:
k = 0, 1, 2, ..., 15
(顺序使用) - Round 2:
k = (1 + 5i) mod 16
(i从0到15) - Round 3:
k = (5 + 3i) mod 16
(i从0到15) - Round 4:
k = 7i mod 16
(i从0到15)
常量表与循环左移
每步操作使用一个预定义的32位常量 T[1..64]
,其值为 ⌊2^32 × |sin(i)|⌋
(i为步数)。循环左移位数 s
按如下规则变化:
- Round 1:
s = [7, 12, 17, 22]
循环使用 - Round 2:
s = [5, 9, 14, 20]
- Round 3:
s = [4, 11, 16, 23]
- Round 4:
s = [6, 10, 15, 21]
单步操作详解(以第i步为例)
每步操作对寄存器 A, B, C, D
进行更新,公式如下:
计算中间值
temp=(A+F(B,C,D)+M[k]+T[i])⋘s
(其中 +
是模 2^32 加法,<<< s
表示循环左移s位)
更新寄存器
A=D,D=C,C=B,B=B+temp
生成最终哈希值
将所有块处理完成后,将寄存器A、B、C、D的值按小端序拼接,转换为十六进制字符串,即为MD5哈希值。