SM4分组密码算法的密钥扩展算法详解
字数 1196 2025-11-14 19:18:34
SM4分组密码算法的密钥扩展算法详解
我将详细讲解SM4分组密码算法的密钥扩展过程。SM4是中国国家密码管理局发布的分组密码算法,采用32轮非线性迭代结构,分组长度和密钥长度均为128位。
一、算法概述
SM4的密钥扩展算法将128位初始密钥扩展为32个32位轮密钥。整个过程采用与加密算法类似的轮函数结构,但使用固定参数。
二、密钥扩展步骤
- 初始密钥处理
初始密钥MK = (MK₀, MK₁, MK₂, MK₃),每个MKᵢ为32位
首先通过异或固定密钥FK进行预处理:
(K₀, K₁, K₂, K₃) = (MK₀ ⊕ FK₀, MK₁ ⊕ FK₁, MK₂ ⊕ FK₂, MK₃ ⊕ FK₃)
其中固定密钥FK为:
FK₀ = 0xA3B1BAC6
FK₁ = 0x56AA3350
FK₂ = 0x677D9197
FK₃ = 0xB27022DC
- 轮密钥生成迭代
对于i = 0到31,按以下公式生成轮密钥:
rkᵢ = Kᵢ₊₄ = Kᵢ ⊕ T'(Kᵢ₊₁ ⊕ Kᵢ₊₂ ⊕ Kᵢ₊₃ ⊕ CKᵢ)
其中:
- T'变换是密钥扩展中的合成变换
- CKᵢ是固定参数,每轮不同
- T'变换详解
T'变换由非线性变换τ和线性变换L'组成:
T'(·) = L'(τ(·))
非线性变换τ:将32位输入分为4个字节,分别通过S盒替换
设输入X = (x₀, x₁, x₂, x₃),则:
τ(X) = (Sbox(x₀), Sbox(x₁), Sbox(x₂), Sbox(x₃))
SM4的S盒是一个8×8的固定置换表,提供非线性特性。
- 线性变换L'
L'变换定义如下:
L'(B) = B ⊕ (B <<< 13) ⊕ (B <<< 23)
其中<<<表示循环左移,这个变换提供扩散效果。
- 固定参数CK生成
CKᵢ通过以下方式生成:
设ckᵢ,ⱼ为CKᵢ的第j字节(j=0,1,2,3)
ckᵢ,ⱼ = (4i + j) × 7 mod 256
然后将字节组合成32位字CKᵢ。
三、完整计算示例
以第0轮轮密钥生成为例:
-
计算中间值:
B = K₁ ⊕ K₂ ⊕ K₃ ⊕ CK₀ -
应用非线性变换:
B' = τ(B) = Sbox(B₀) || Sbox(B₁) || Sbox(B₂) || Sbox(B₃) -
应用线性变换:
B'' = L'(B') = B' ⊕ (B' <<< 13) ⊕ (B' <<< 23) -
生成轮密钥:
rk₀ = K₄ = K₀ ⊕ B''
重复此过程31次,得到全部32个轮密钥。
四、算法特点
- 密钥扩展与加密结构相似,实现简单
- 每轮轮密钥都依赖于之前所有密钥
- 固定参数CK确保轮密钥的随机性
- 非线性S盒和线性变换提供足够的安全性
这个过程确保了即使初始密钥有少量变化,也会通过多轮迭代产生完全不同的轮密钥序列,满足密码学的扩散和混淆原则。