SM3密码杂凑算法的轮函数设计
字数 1114 2025-11-16 06:49:13
SM3密码杂凑算法的轮函数设计
我将为您详细讲解SM3密码杂凑算法的轮函数设计。SM3是中国国家密码管理局发布的密码杂凑算法标准,广泛应用于数字签名、消息认证码等场景。
算法概述
SM3算法生成256位哈希输出,采用Merkle-Damgård结构,处理512位消息分组。其核心是64轮的压缩函数,每轮使用不同的布尔函数和常量。
轮函数详细设计
1. 消息扩展
在进入轮函数前,512位消息块首先被扩展为132个32位字:
- 前16个字W₀~W₁₅直接来自消息分组的16个32位字
- 后续字通过递归计算:
Wⱼ = P₁(Wⱼ₋₁₆ ⊕ Wⱼ₋₉ ⊕ (Wⱼ₋₃ ≪ 15)) ⊕ (Wⱼ₋₁₃ ≪ 7) ⊕ Wⱼ₋₆
其中P₁(X) = X ⊕ (X ≪ 15) ⊕ (X ≪ 23)
3. 轮函数结构
轮函数对8个32位工作变量(A,B,C,D,E,F,G,H)进行64轮迭代:
4. 压缩函数核心运算
第j轮计算过程(0 ≤ j < 64):
- 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)
其中Wⱼ' = Wⱼ ⊕ Wⱼ₊₄
5. 布尔函数设计
算法将64轮分为4个16轮阶段,使用不同的布尔函数:
FFⱼ(X,Y,Z) =
- 当0 ≤ j < 16:X ⊕ Y ⊕ Z
- 当16 ≤ j < 64:(X ∧ Y) ∨ (X ∧ Z) ∨ (Y ∧ Z)
GGⱼ(X,Y,Z) =
- 当0 ≤ j < 16:X ⊕ Y ⊕ Z
- 当16 ≤ j < 64:(X ∧ Y) ∨ (¬X ∧ Z)
6. 常量设计
- 加法常量Tⱼ:当0 ≤ j < 16时为0x79CC4519,当16 ≤ j < 64时为0x7A879D8A
- 置换函数P₀(X) = X ⊕ (X ≪ 9) ⊕ (X ≪ 17)
7. 最终处理
完成64轮后,将更新后的工作变量与初始值进行异或,得到该消息分组的压缩结果,作为下一个分组的初始值。
设计特点分析
- 采用与SHA-256相似但不同的布尔函数和常量
- 通过四个阶段的布尔函数变化增加非线性
- 消息扩展中的P₁函数提供良好的雪崩效应
- 轮函数中的双路计算(TT1和TT2)增强扩散特性
这种轮函数设计确保了SM3算法具备强碰撞抵抗性和原像抵抗性,满足密码学安全要求。