白乐天

道阻且长,行则将至。

详解MD5

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
2
3
4
A = 0x67452301  
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476

四轮非线性变换

每个512位块会经过四轮处理(每轮16步,共64步),每轮使用不同的逻辑函数和参数

四轮逻辑函数

每轮使用不同的非线性函数(共4个):

  • Round 1F(B, C, D) = (B ∧ C) ∨ (¬B ∧ D)
  • Round 2G(B, C, D) = (B ∧ D) ∨ (C ∧ ¬D)
  • Round 3H(B, C, D) = B ⊕ C ⊕ D
  • Round 4I(B, C, D) = C ⊕ (B ∨ ¬D)

消息子块的使用顺序

每轮以不同顺序使用16个消息子块 M[k]

  • Round 1k = 0, 1, 2, ..., 15(顺序使用)
  • Round 2k = (1 + 5i) mod 16(i从0到15)
  • Round 3k = (5 + 3i) mod 16(i从0到15)
  • Round 4k = 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哈希值。