SM4分组密码算法的轮函数设计与加密过程
字数 1469 2025-11-11 15:37:59
SM4分组密码算法的轮函数设计与加密过程
我将详细讲解SM4分组密码算法的轮函数设计与加密过程。SM4是中国国家密码管理局发布的分组密码算法标准,采用32轮非平衡Feistel结构,分组长度和密钥长度均为128位。
1. 算法概述
SM4算法对128位明文分组进行32轮迭代加密,每轮使用一个32位的轮密钥。算法包含密钥扩展和加密两个主要部分。加密过程采用非线性迭代结构,每轮对32位数据进行非线性变换。
2. 加密过程框架
设明文输入为(X₀, X₁, X₂, X₃) ∈ (GF(2)³²)⁴,经过32轮迭代后输出密文(Y₀, Y₁, Y₂, Y₃):
- 初始化:将128位明文分为4个32位字
- 迭代规则:X_{i+4} = F(X_i, X_{i+1}, X_{i+2}, X_{i+3}, rk_i) = X_i ⊕ T(X_{i+1} ⊕ X_{i+2} ⊕ X_{i+3} ⊕ rk_i)
- 最终输出:(Y₀, Y₁, Y₂, Y₃) = (X₃₅, X₃₄, X₃₃, X₃₂)
3. 轮函数T详解
T: GF(2)³² → GF(2)³² 由复合变换T(·) = L(τ(·))构成:
- 非线性变换τ:将32位输入分为4个字节(a₀, a₁, a₂, a₃),每个字节通过S盒替换:
(b₀, b₁, b₂, b₃) = (S(a₀), S(a₁), S(a₂), S(a₃))
SM4的S盒是8×8比特置换,由仿射变换和有限域逆运算复合而成 - 线性变换L:对τ的输出进行线性扩散
L(B) = B ⊕ (B <<< 2) ⊕ (B <<< 10) ⊕ (B <<< 18) ⊕ (B <<< 24)
其中<<<表示循环左移
4. 密钥扩展过程
轮密钥rk_i由加密密钥MK通过扩展算法生成:
- 初始化:(K₀, K₁, K₂, K₃) = MK ⊕ (FK₀, FK₁, FK₂, FK₃)
FK为系统参数:FK₀=0xA3B1BAC6, FK₁=0x56AA3350, FK₂=0x677D9197, FK₃=0xB27022DC - 迭代生成:rk_i = K_{i+4} = K_i ⊕ T'(K_{i+1} ⊕ K_{i+2} ⊕ K_{i+3} ⊕ CK_i)
T'变换与T类似,但线性部分改为L'(B) = B ⊕ (B <<< 13) ⊕ (B <<< 23)
CK_i为固定参数,通过CK_ij = (4i+j)×7 mod 256生成
5. 完整加密流程示例
以明文"0123456789ABCDEF"为例:
- 字节分组:X₀=0x01234567, X₁=0x89ABCDEF, X₂=0xFEDCBA98, X₃=0x76543210
- 第一轮计算:
- 中间值:X₄ = X₀ ⊕ T(X₁ ⊕ X₂ ⊕ X₃ ⊕ rk₀)
- 先计算异或:U = X₁ ⊕ X₂ ⊕ X₃ ⊕ rk₀
- 经τ变换:每个字节查S盒得V
- 经L变换:W = L(V) = V ⊕ (V <<< 2) ⊕ (V <<< 10) ⊕ (V <<< 18) ⊕ (V <<< 24)
- 得到X₄ = X₀ ⊕ W
- 重复32轮后反序输出
6. 设计特点分析
- 非平衡Feistel结构增强扩散效果
- S盒具有最佳非线性度和代数免疫性
- 线性变换L确保高扩散性
- 密钥扩展与加密结构相似,实现简洁
这个设计确保了SM4算法在面对差分密码分析、线性密码分析等攻击时的安全性,同时保持了较高的执行效率。