SM3密码杂凑算法的轮函数设计
SM3是中国国家密码管理局发布的密码杂凑算法,输出长度为256比特,广泛应用于数字签名、消息认证等场景。其轮函数是压缩函数的核心部件,负责将输入数据充分混淆和扩散。下面详细讲解轮函数的设计步骤。
1. 轮函数的输入与结构
SM3的压缩函数处理512比特的消息分组,内部包含64轮迭代。每轮的输入如下:
- 状态向量(256比特):由8个32比特字 \(V^{(i)} = (A, B, C, D, E, F, G, H)\) 表示,初始值为上一轮输出或初始向量(IV)。
- 消息扩展后的字 \(W_j\)(32比特):由当前消息分组通过扩展算法生成,每轮使用一个 \(W_j\) 和 \(W_j'\)(其中 \(W_j' = W_j \oplus W_{j+4}\),用于加速扩散)。
- 固定常量 \(T_j\):64个预定义的32比特常量,前16轮与后48轮取值不同,用于消除对称性。
轮函数的目标是更新状态向量 \(V^{(i)} \to V^{(i+1)}\)。
2. 轮函数的计算步骤
每轮操作分为以下三步:
步骤1:消息调度与常量混合
- 计算中间值 \(SS1\):
\[ SS1 = ((A \lll 12) + E + (T_j \lll j)) \lll 7 \]
其中 \(\lll\) 表示循环左移,\(j\) 为轮数(0 ≤ j ≤ 63)。
- 计算 \(SS2\):
\[ SS2 = SS1 \oplus (A \lll 12) \]
步骤2:非线性变换与消息注入
- 计算两个FF函数(比特级布尔函数):
- 前16轮(\(j \leq 15\)):
\[ FF_j(X,Y,Z) = X \oplus Y \oplus Z \]
- 后48轮(\(j \geq 16\)):
\[ FF_j(X,Y,Z) = (X \land Y) \lor (X \land Z) \lor (Y \land Z) \]
使用 \(FF_j\) 计算 \(TT1\):
\[ TT1 = FF_j(A, B, C) + D + SS2 + W_j' \]
- 计算两个GG函数(另一组布尔函数):
- 前16轮:
\[ GG_j(X,Y,Z) = X \oplus Y \oplus Z \]
- 后48轮:
\[ GG_j(X,Y,Z) = (X \land Y) \lor (\lnot X \land Z) \]
使用 \(GG_j\) 计算 \(TT2\):
\[ TT2 = GG_j(E, F, G) + H + SS1 + W_j \]
步骤3:状态更新
更新后的状态向量为:
\[\begin{aligned} D &= C \\ C &= B \lll 9 \\ B &= A \\ A &= TT1 \\ H &= G \\ G &= F \lll 19 \\ F &= E \\ E &= P_0(TT2) \end{aligned} \]
其中 \(P_0(X) = X \oplus (X \lll 9) \oplus (X \lll 17)\) 是SM3定义的线性变换,用于增强扩散性。
3. 轮函数的设计特点
- 双重消息注入:每轮同时使用 \(W_j\) 和 \(W_j'\),加快消息比特的扩散速度。
- 分段布尔函数:FF和GG函数在前16轮采用线性运算(快速混淆),后48轮采用非线性运算(抵抗攻击),平衡效率与安全性。
- 多级移位操作:循环左移(如12、7、9、19比特)破坏比特间的线性关系,防止差分攻击。
- 常量消除对称性:\(T_j\) 的前后差异避免轮函数出现固定点。
4. 轮函数与整体结构的关系
64轮迭代后,状态向量 \(V^{(64)}\) 与初始向量 \(V^{(0)}\) 进行异或,得到当前分组的哈希输出。轮函数的强扩散性和非线性确保SM3满足抗碰撞性、抗原像性等安全要求。
通过以上步骤,SM3的轮函数实现了高效且安全的哈希计算,适用于资源受限环境。