SM3密码杂凑算法
字数 856 2025-10-28 22:11:24
SM3密码杂凑算法
题目描述:
SM3是我国国家密码管理局于2010年发布的一种密码杂凑算法(哈希算法),输出长度为256位。请详细讲解SM3算法的完整计算过程,包括消息填充、消息扩展、压缩函数迭代等关键步骤。
算法原理:
SM3采用Merkle-Damgård结构,将输入消息划分为512位的分组进行处理。核心流程包含以下步骤:
1. 消息填充
- 假设原始消息长度为L位(L<2^64)
- 在消息末尾添加一个"1":
消息 || 1 - 添加k个"0",使得填充后长度满足:(L + 1 + k) ≡ 448 (mod 512)
- 最后添加64位的长度字段(大端序表示L):
消息 || 1 || 0^k || [L]₆₄ - 示例:对空消息(L=0)填充后为:
1 || 0⁴⁴⁷ || 0x0000000000000000
2. 初始化向量
设置8个32位初始寄存器值(十六进制):
IV = [
0x7380166F, 0x4914B2B9,
0x172442D7, 0xDA8A0600,
0xA96F30BC, 0x163138AA,
0xE38DEE4D, 0xB0FB0E4E
]
3. 消息扩展(对每个512位分组)
- 将分组划分为16个32位字W₀~W₁₅
- 扩展生成132个字:
FOR j=16 TO 67: Wⱼ = P₁(Wⱼ₋₁₆ ⊕ Wⱼ₋₉ ⊕ (Wⱼ₋₃ ≪ 15)) ⊕ (Wⱼ₋₁₃ ≪ 7) ⊕ Wⱼ₋₆ - 派生W′₀~W′₆₃:
W′ⱼ = Wⱼ ⊕ Wⱼ₊₄
4. 压缩函数核心运算
定义布尔函数和置换函数:
FFⱼ(X,Y,Z) =
X⊕Y⊕Z (0≤j≤15)
(X∧Y)∨(X∧Z)∨(Y∧Z) (16≤j≤63)
GGⱼ(X,Y,Z) =
X⊕Y⊕Z (0≤j≤15)
(X∧Y)∨(¬X∧Z) (16≤j≤63)
置换函数:
P₀(X) = X ⊕ (X ≪ 9) ⊕ (X ≪ 17)
P₁(X) = X ⊕ (X ≪ 15) ⊕ (X ≪ 23)
5. 迭代压缩流程
对每个消息分组执行:
- 设置工作变量:
(A,B,C,D,E,F,G,H) ← 当前寄存器值 - 进行64轮迭代(j=0~63):
- 计算中间量:
SS1 = ((A ≪ 12) + E + (Tⱼ ≪ j)) ≪ 7 SS2 = SS1 ⊕ (A ≪ 12) TT1 = FFⱼ(A,B,C) + D + SS2 + W′ⱼ TT2 = GGⱼ(E,F,G) + H + SS1 + Wⱼ - 更新寄存器:
D = C C = B ≪ 9 B = A A = TT1 H = G G = F ≪ 19 F = E E = P₀(TT2)
- 计算中间量:
- 更新最终寄存器值:
V⁽ⁱ⁺¹⁾ ← V⁽ⁱ⁾ ⊕ (A,B,C,D,E,F,G,H)
6. 输出结果
处理完所有分组后,将最终寄存器值连接即为256位杂凑值:
H = A || B || C || D || E || F || G || H
示例验证:
对空消息输入,SM3输出为:
0x1AB21D8355CFA17F 0x8E712A8E26B8A41B 0x0F41D5C3FBB7DA38 0x3D219EF14A0A4573
通过这种结构,SM3实现了抗碰撞性和原像抵抗等安全特性,广泛应用于数字签名和消息认证场景。