SM4分组密码算法中的密钥加(Key Addition)与轮函数F的详细交互过程
字数 1953 2025-12-07 20:56:04

SM4分组密码算法中的密钥加(Key Addition)与轮函数F的详细交互过程

在SM4分组密码算法中,每一轮的加密操作都依赖于轮函数F。F函数内部的计算需要与当前轮的轮密钥进行结合,这个结合点就是“密钥加”操作。理解密钥如何精确地融入轮函数的计算链,是掌握SM4加密过程细节的关键。

1. 预备知识回顾:SM4的总体结构

SM4是一种采用非平衡Feistel网络结构的分组密码算法,也称为广义Feistel结构。其特点是:

  • 分组长度:128位。
  • 密钥长度:128位。
  • 轮数:32轮。
  • 结构:将128位明文分成4个32位的字(X₀, X₁, X₂, X₃)。在每一轮i(i=0,1,...,31)中,用轮函数F更新其中一个字,并与另一个字进行异或,然后整体左循环移位。

2. 轮函数F的形式化定义

轮函数F是每轮加密的核心,其输入有三个部分:

  1. 当前轮四个状态字中的三个:记为X_{i+1}, X_{i+2}, X_{i+3} (每个32位)。
  2. 当前轮的轮密钥:记为rk_i (32位)。

轮函数F的定义为:
F(X_{i+1}, X_{i+2}, X_{i+3}, rk_i) = X_{i+1} ⊕ T(X_{i+2} ⊕ X_{i+3} ⊕ rk_i)

这里表示32位逐比特异或(XOR)操作。

3. 逐步剖析:密钥加如何融入F函数

我们聚焦于F函数内部的T(·)变换,因为密钥加操作就发生在这个变换的输入处。我们将T(·)变换拆解开来观察:

步骤1:异或运算组合输入
首先,计算中间值A
A = X_{i+2} ⊕ X_{i+3} ⊕ rk_i
这是第一个也是唯一的密钥加步骤rk_i在此处与状态字X_{i+2}X_{i+3}进行异或。这是轮密钥首次并直接参与到数据计算中。

步骤2:非线性变换τ
变换T由两部分组成:非线性变换τ和线性变换L。首先对A应用τ
τ变换由4个并行的8进8出的S盒(S-box)构成。具体来说,将32位的A等分为4个字节(a₀, a₁, a₂, a₃),然后并行地通过S盒替换:
B = τ(A) = (Sbox(a₀), Sbox(a₁), Sbox(a₂), Sbox(a₃))
得到一个新的32位字B。S盒是SM4中唯一的非线性元件,负责混淆,其设计能够抵抗差分和线性密码分析。经过S盒,轮密钥rk_i的影响被非线性地扩散B的每一个字节中。

步骤3:线性变换L
接着,对B应用线性变换L
C = L(B) = B ⊕ (B <<< 2) ⊕ (B <<< 10) ⊕ (B <<< 18) ⊕ (B <<< 24)
这里<<<表示32位循环左移。L变换的目的是快速扩散,它将B中一个比特的变化,通过多个不同偏移量的循环移位和异或,迅速扩散到输出C的多个比特位上,从而实现了良好的雪崩效应。至此,T变换完成:T(A) = L(τ(A)) = C

步骤4:生成下一轮状态字
最后,计算本轮输出的新状态字X_{i+4}
X_{i+4} = F(...) = X_{i+1} ⊕ C
这里,经过复杂变换T(内含密钥加、S盒、线性扩散)的结果C,再与另一个状态字X_{i+1}进行异或,完成了本轮的更新。

4. 过程图解与总结

我们可以将一轮中密钥参与的完整数据流总结如下:

(X_{i+1}, X_{i+2}, X_{i+3}, rk_i)

A = X_{i+2} ⊕ X_{i+3} ⊕ rk_i <-- 【密钥加点】

B = τ(A) = Sbox(A) <-- 【密钥影响被非线性混淆】

C = L(B) <-- 【密钥影响被线性快速扩散】

X_{i+4} = X_{i+1} ⊕ C

关键交互点

  1. 位置唯一性:密钥加操作在轮函数的最开始,即T变换的输入处,并且只此一处。
  2. 作用链
    • 密钥rk_i首先通过异或(线性操作)改变中间值A
    • 随后A经过S盒(τ),密钥比特的影响被非线性地混淆和隐藏,其代数特性变得复杂。
    • 接着经过线性变换L,上一步得到的非线性结果被快速扩散到整个32位输出C中。
    • 最终,C再与另一个状态字X_{i+1}异或,将本轮包含密钥信息的结果“混合”进整体的状态寄存器中,并参与下一轮的计算。

通过这样的设计,每一轮的轮密钥都深度参与并改变了状态的演化路径。经过32轮这样的迭代,初始明文和密钥之间建立了高度复杂、非线性的关系,从而实现了加密的混淆与扩散原则,保证了算法的安全性。

SM4分组密码算法中的密钥加(Key Addition)与轮函数F的详细交互过程 在SM4分组密码算法中,每一轮的加密操作都依赖于轮函数F。F函数内部的计算需要与当前轮的轮密钥进行结合,这个结合点就是“密钥加”操作。理解密钥如何精确地融入轮函数的计算链,是掌握SM4加密过程细节的关键。 1. 预备知识回顾:SM4的总体结构 SM4是一种采用非平衡Feistel网络结构的分组密码算法,也称为广义Feistel结构。其特点是: 分组长度 :128位。 密钥长度 :128位。 轮数 :32轮。 结构 :将128位明文分成4个32位的字(X₀, X₁, X₂, X₃)。在每一轮i(i=0,1,...,31)中,用轮函数F更新其中一个字,并与另一个字进行异或,然后整体左循环移位。 2. 轮函数F的形式化定义 轮函数F是每轮加密的核心,其输入有三个部分: 当前轮四个状态字中的三个:记为 X_{i+1} , X_{i+2} , X_{i+3} (每个32位)。 当前轮的轮密钥:记为 rk_i (32位)。 轮函数F的定义为: F(X_{i+1}, X_{i+2}, X_{i+3}, rk_i) = X_{i+1} ⊕ T(X_{i+2} ⊕ X_{i+3} ⊕ rk_i) 这里 ⊕ 表示32位逐比特异或(XOR)操作。 3. 逐步剖析:密钥加如何融入F函数 我们聚焦于F函数内部的 T(·) 变换,因为密钥加操作就发生在这个变换的输入处。我们将 T(·) 变换拆解开来观察: 步骤1:异或运算组合输入 首先,计算中间值 A : A = X_{i+2} ⊕ X_{i+3} ⊕ rk_i 这是 第一个也是唯一的密钥加步骤 。 rk_i 在此处与状态字 X_{i+2} 和 X_{i+3} 进行异或。这是轮密钥首次并直接参与到数据计算中。 步骤2:非线性变换τ 变换 T 由两部分组成:非线性变换 τ 和线性变换 L 。首先对 A 应用 τ 。 τ 变换由4个并行的8进8出的S盒(S-box)构成。具体来说,将32位的 A 等分为4个字节(a₀, a₁, a₂, a₃),然后并行地通过S盒替换: B = τ(A) = (Sbox(a₀), Sbox(a₁), Sbox(a₂), Sbox(a₃)) 得到一个新的32位字 B 。S盒是SM4中唯一的非线性元件,负责混淆,其设计能够抵抗差分和线性密码分析。经过S盒,轮密钥 rk_i 的影响被 非线性地扩散 到 B 的每一个字节中。 步骤3:线性变换L 接着,对 B 应用线性变换 L : C = L(B) = B ⊕ (B <<< 2) ⊕ (B <<< 10) ⊕ (B <<< 18) ⊕ (B <<< 24) 这里 <<< 表示32位循环左移。 L 变换的目的是 快速扩散 ,它将 B 中一个比特的变化,通过多个不同偏移量的循环移位和异或,迅速扩散到输出 C 的多个比特位上,从而实现了良好的雪崩效应。至此, T 变换完成: T(A) = L(τ(A)) = C 。 步骤4:生成下一轮状态字 最后,计算本轮输出的新状态字 X_{i+4} : X_{i+4} = F(...) = X_{i+1} ⊕ C 这里,经过复杂变换 T (内含密钥加、S盒、线性扩散)的结果 C ,再与另一个状态字 X_{i+1} 进行异或,完成了本轮的更新。 4. 过程图解与总结 我们可以将一轮中密钥参与的完整数据流总结如下: (X_{i+1}, X_{i+2}, X_{i+3}, rk_i) ↓ A = X_{i+2} ⊕ X_{i+3} ⊕ rk_i <-- 【密钥加点】 ↓ B = τ(A) = Sbox(A) <-- 【密钥影响被非线性混淆】 ↓ C = L(B) <-- 【密钥影响被线性快速扩散】 ↓ X_{i+4} = X_{i+1} ⊕ C 关键交互点 : 位置唯一性 :密钥加操作在轮函数的最开始,即 T 变换的输入处,并且只此一处。 作用链 : 密钥 rk_i 首先通过 异或 (线性操作)改变中间值 A 。 随后 A 经过 S盒(τ) ,密钥比特的影响被非线性地混淆和隐藏,其代数特性变得复杂。 接着经过 线性变换L ,上一步得到的非线性结果被快速扩散到整个32位输出 C 中。 最终, C 再与另一个状态字 X_{i+1} 异或,将本轮包含密钥信息的结果“混合”进整体的状态寄存器中,并参与下一轮的计算。 通过这样的设计,每一轮的轮密钥都深度参与并改变了状态的演化路径。经过32轮这样的迭代,初始明文和密钥之间建立了高度复杂、非线性的关系,从而实现了加密的混淆与扩散原则,保证了算法的安全性。