SM3密码杂凑算法的压缩函数设计
字数 1924 2025-10-30 17:43:25
SM3密码杂凑算法的压缩函数设计
题目描述
SM3是中国国家密码管理局发布的密码杂凑算法,输出长度为256位。其核心是压缩函数,它将512位的消息分组和256位的中间哈希值作为输入,通过多轮迭代生成新的256位哈希值。本题要求详细讲解SM3压缩函数的结构、轮运算步骤及设计原理。
1. 压缩函数整体结构
- 输入:
- 512位消息分组 \(M\)(划分为16个32位字 \(W_0, W_1, \dots, W_{15}\))
- 256位当前哈希值 \(V^{(i)}\)(划分为8个32位寄存器 \(A, B, C, D, E, F, G, H\))
- 输出:256位新哈希值 \(V^{(i+1)}\)
- 流程:
- 消息扩展:将16个消息字 \(W_0 \sim W_{15}\) 扩展为132个字(\(W_0 \sim W_{67}\) 和 \(W_0' \sim W_{63}'\)),用于后续轮运算。
- 64轮迭代:每轮更新寄存器 \(A \sim H\) 的值。
- 反馈叠加:将迭代后的寄存器值与初始 \(V^{(i)}\) 按位异或,得到 \(V^{(i+1)}\)。
2. 消息扩展过程
消息扩展通过线性递归和置换增强雪崩效应:
- 前16字:直接取自消息分组 \(M\) 的划分。
- 后续字(\(W_{16} \sim W_{67}\)):
\[ W_j = P_1(W_{j-16} \oplus W_{j-9} \oplus (W_{j-3} \ll 15)) \oplus (W_{j-13} \ll 7) \oplus W_{j-6} \]
其中 \(P_1(X) = X \oplus (X \ll 15) \oplus (X \ll 23)\) 是线性置换。
- 附加字(\(W_0' \sim W_{63}'\)):
\[ W_j' = W_j \oplus W_{j+4} \]
用于压缩函数的另一部分计算。
3. 轮函数设计
每轮操作包含非线性布尔函数、模加运算和字置换:
- 轮常量:64个固定32位常量 \(T_j\)(前16轮为 \(0x79CC4519\),后48轮为 \(0x7A879D8A\))。
- 布尔函数 \(FF_j / GG_j\):
- 前16轮(\(0 \leq j \leq 15\)):
\[ FF_j(X,Y,Z) = X \oplus Y \oplus Z, \quad GG_j(X,Y,Z) = X \oplus Y \oplus Z \]
- 后48轮(\(16 \leq j \leq 63\)):
\[ FF_j(X,Y,Z) = (X \land Y) \lor (X \land Z) \lor (Y \land Z), \quad GG_j(X,Y,Z) = (X \land Y) \lor (\lnot X \land Z) \]
- 单轮更新步骤(以第 \(j\) 轮为例):
- 计算中间量 \(SS1 = ((A \ll 12) + E + (T_j \ll j)) \ll 7\)
- 计算 \(SS2 = SS1 \oplus (A \ll 12)\)
- 更新寄存器:
\begin{align*}
TT1 &= FF_j(A,B,C) + D + SS2 + W_j' \
TT2 &= GG_j(E,F,G) + H + SS1 + W_j \
D &= C \
C &= B \ll 9 \
B &= A \
A &= TT1 \
H &= G \
G &= F \ll 19 \
F &= E \
E &= P_0(TT2)
\end{align*}
其中 \(P_0(X) = X \oplus (X \ll 9) \oplus (X \ll 17)\) 是另一线性置换。
4. 反馈与安全性设计
- 雪崩效应:通过移位、异或、模加和非线性函数,使单个比特变化快速扩散。
- 抗碰撞性:压缩函数的每一轮依赖全部8个寄存器,且消息扩展增加了线性相关性分析的难度。
- 与SHA-256对比:SM3使用更多置换操作(如 \(P_0, P_1\))和不同的布尔函数结构,增强对特定攻击的抵抗力。
总结
SM3压缩函数通过消息扩展、多轮迭代和非线性运算实现高强度混淆,其设计兼顾效率与安全性,适用于数字签名、消息认证等场景。理解其结构有助于掌握现代杂凑算法的核心思想。