SM4分组密码算法的密钥扩展算法详解
我将详细讲解SM4分组密码算法的密钥扩展算法,包括算法描述、具体步骤和设计原理。
算法概述
SM4是中国国家密码管理局发布的分组密码算法,采用32轮非平衡Feistel结构。其密钥扩展算法将128位初始密钥扩展为32个32位轮密钥。
密钥扩展详细步骤
1. 初始参数设置
-
固定参数:FK = (FK₀, FK₁, FK₂, FK₃)
FK₀ = 0xA3B1BAC6
FK₁ = 0x56AA3350
FK₂ = 0x677D9197
FK₃ = 0xB27022DC -
固定常量:CK₀到CK₃₁,共32个常量
通过公式生成:CKᵢ = (28i mod 256) || (29i mod 256) || (30i mod 256) || (31i mod 256)
其中i=0,1,...,31
2. 中间密钥生成
-
初始变换:
(K₀, K₁, K₂, K₃) = (MK₀⊕FK₀, MK₁⊕FK₁, MK₂⊕FK₂, MK₃⊕FK₃)将128位主密钥MK分成4个32位字:
MK = (MK₀, MK₁, MK₂, MK₃) -
轮密钥迭代生成:
对于i从0到31:Kᵢ₊₄ = Kᵢ ⊕ T'(Kᵢ₊₁ ⊕ Kᵢ₊₂ ⊕ Kᵢ₊₃ ⊕ CKᵢ)其中T'变换是密钥扩展专用的线性变换
3. T'变换详解
T'变换由非线性变换τ和线性变换L'组成:
T'(·) = L'(τ(·))
-
非线性变换τ:
将32位输入分成4个字节,分别通过S盒替换:
τ(A) = (S(a₀), S(a₁), S(a₂), S(a₃))
其中A = a₀ || a₁ || a₂ || a₃,每个aᵢ为8位 -
线性变换L':
L'(B) = B ⊕ (B ≪ 13) ⊕ (B ≪ 23)
其中B为32位输入,≪表示循环左移
4. 轮密钥输出
生成的轮密钥为:
rkᵢ = Kᵢ₊₄ (i=0,1,...,31)
每个rkᵢ都是32位,共生成32个轮密钥用于加密的32轮运算。
设计特点分析
1. 密钥相关性
- 每个轮密钥都与所有主密钥位相关
- 通过多轮迭代实现充分的密钥混合
2. 非线性特性
- S盒提供非线性,增强抗差分和线性密码分析能力
- 4个S盒并行工作,提高运算效率
3. 扩散特性
- 线性变换L'通过循环移位实现良好的位扩散
- 每轮密钥生成都依赖于前4轮的结果
4. 效率优化
- 密钥扩展可预计算,不影响实时加密性能
- 算法结构规整,适合硬件实现
安全性考虑
该密钥扩展算法能有效抵抗相关密钥攻击和滑动攻击,确保生成的轮密钥具有足够的随机性和独立性,为SM4加密提供坚实的安全基础。