SM3密码杂凑算法的轮函数设计
字数 1739 2025-11-28 01:55:15

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. 轮函数的设计特点

  1. 双重消息注入:每轮同时使用 \(W_j\)\(W_j'\),加快消息比特的扩散速度。
  2. 分段布尔函数:FF和GG函数在前16轮采用线性运算(快速混淆),后48轮采用非线性运算(抵抗攻击),平衡效率与安全性。
  3. 多级移位操作:循环左移(如12、7、9、19比特)破坏比特间的线性关系,防止差分攻击。
  4. 常量消除对称性\(T_j\) 的前后差异避免轮函数出现固定点。

4. 轮函数与整体结构的关系

64轮迭代后,状态向量 \(V^{(64)}\) 与初始向量 \(V^{(0)}\) 进行异或,得到当前分组的哈希输出。轮函数的强扩散性和非线性确保SM3满足抗碰撞性、抗原像性等安全要求。

通过以上步骤,SM3的轮函数实现了高效且安全的哈希计算,适用于资源受限环境。

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的轮函数实现了高效且安全的哈希计算,适用于资源受限环境。