SM4分组密码算法的轮密钥生成过程
我将为您详细讲解SM4算法中轮密钥的生成机制。SM4是中国国家密码管理局公布的分组密码算法,采用32轮非线性迭代结构。
算法基础
- 分组长度:128位
- 密钥长度:128位
- 轮数:32轮
- 轮密钥:每轮使用32位轮密钥,共生成32个轮密钥
轮密钥生成详细步骤
步骤1:系统参数初始化
SM4使用两个固定的系统参数:
- FK = (FK₀, FK₁, FK₂, FK₃) = (0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC)
- CK:32个固定常数,每个32位,通过非线性操作生成
步骤2:密钥扩展预处理
将128位初始密钥K分为4个32位字:
K = (K₀, K₁, K₂, K₃)
然后与系统参数FK进行异或操作,得到初始密钥状态:
(K₀', K₁', K₂', K₃') = (K₀ ⊕ FK₀, K₁ ⊕ FK₁, K₂ ⊕ FK₂, K₃ ⊕ FK₃)
步骤3:轮密钥迭代生成
对于i = 0到31,按以下公式生成轮密钥rkᵢ:
rkᵢ = K_{i+4} = K_i ⊕ T'(K_{i+1} ⊕ K_{i+2} ⊕ K_{i+3} ⊕ CK_i)
其中:
- T'是合成变换函数
- CK_i是第i轮的固定常数
步骤4:合成变换T'详解
T' = L' ∘ τ
τ变换(非线性变换):
将32位输入分为4个字节:
X = (x₀, x₁, x₂, x₃)
对每个字节应用S盒替换:
τ(X) = (S(x₀), S(x₁), S(x₂), S(x₃))
SM4的S盒是一个8×8的置换表,提供非线性特性。
L'变换(线性变换):
L'(B) = B ⊕ (B ≪ 13) ⊕ (B ≪ 23)
这是一个线性扩散层,通过循环左移和异或操作提供扩散效果。
步骤5:固定常数CK生成
CK_i,j = (4i + j) × 7 (mod 256),其中:
- i = 0,1,...,31(轮数)
- j = 0,1,2,3(字节位置)
- CK_i = (CK_{i,0}, CK_{i,1}, CK_{i,2}, CK_{i,3}) × 2²⁴
实例演示
假设初始密钥K = (K₀, K₁, K₂, K₃) = (0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210)
-
预处理:
K₀' = 0x01234567 ⊕ 0xA3B1BAC6 = 0xA296FFA1
K₁' = 0x89ABCDEF ⊕ 0x56AA3350 = 0xDF01FEBF
K₂' = 0xFEDCBA98 ⊕ 0x677D9197 = 0x99A12B0F
K₃' = 0x76543210 ⊕ 0xB27022DC = 0xC42410CC -
生成第一轮密钥rk₀:
- 计算中间值:K₁' ⊕ K₂' ⊕ K₃' ⊕ CK₀
- 应用τ变换进行S盒替换
- 应用L'变换进行线性扩散
- 与K₀'异或得到rk₀
安全性设计要点
- 密钥相关性:每个轮密钥都与所有原始密钥位相关
- 非线性性:S盒提供足够的非线性抵抗差分和线性密码分析
- 扩散性:L'变换确保密钥位的充分扩散
- 常数多样性:CK常数确保不同轮的轮密钥具有足够差异
通过这种设计,SM4的轮密钥生成过程能够有效抵抗各种密码分析攻击,为加密过程提供安全的密钥材料。