SM4分组密码算法的密钥扩展算法详解
字数 1077 2025-11-13 16:42:56
SM4分组密码算法的密钥扩展算法详解
我将为您详细讲解SM4分组密码算法的密钥扩展过程。SM4是中国国家密码管理局发布的分组密码算法标准,采用32轮非线性迭代结构,分组长度和密钥长度均为128位。
算法概述
SM4的密钥扩展算法将128位初始密钥扩展为32个32位的轮密钥。整个过程采用与加密算法相似的轮函数结构,确保轮密钥之间的强非线性关系。
详细步骤
步骤1:初始参数准备
首先定义两个关键参数:
-
FK系统参数:4个32位固定值
FK0 = 0xA3B1BAC6 FK1 = 0x56AA3350 FK2 = 0x677D9197 FK3 = 0xB27022DC -
CK固定参数:32个32位固定值,通过特定方法生成
- 设cki,j为CK[i]的第j字节(i=0,1,...,31; j=0,1,2,3)
- cki,j = (4i + j) × 7 (mod 256) 的十六进制表示
步骤2:初始密钥加载
将128位初始密钥MK分为4个32位字:
MK = (MK0, MK1, MK2, MK3)
计算初始的4个密钥字:
(K0, K1, K2, K3) = (MK0 ⊕ FK0, MK1 ⊕ FK1, MK2 ⊕ FK2, MK3 ⊕ FK3)
步骤3:轮密钥迭代生成
通过32轮迭代生成32个轮密钥:
对于 i = 0 到 31:
rk[i] = Ki+4 = Ki ⊕ T'(Ki+1 ⊕ Ki+2 ⊕ Ki+3 ⊕ CK[i])
其中:
- T'变换:由非线性变换τ和线性变换L'组成
- T'(B) = L'(τ(B))
步骤4:核心变换详解
非线性变换τ:
- 将32位输入B分为4个8位字节:B = (b0, b1, b2, b3)
- 每个字节通过S盒进行替换:
τ(B) = (Sbox(b0), Sbox(b1), Sbox(b2), Sbox(b3))
线性变换L':
L'(B) = B ⊕ (B <<< 13) ⊕ (B <<< 23)
其中<<<表示循环左移
步骤5:S盒设计
SM4的S盒是一个16×16的置换表,基于有限域GF(2⁸)上的逆运算和仿射变换构造:
- 对输入字节x ∈ GF(2⁸),计算其在GF(2⁸)上的乘法逆(0映射到0)
- 对结果进行仿射变换:y = Ax + c
- 其中A是8×8矩阵,c是常数向量
算法特点
安全性设计
- 密钥相关性:每个轮密钥都与所有初始密钥位相关
- 非线性性:通过S盒确保足够的非线性
- 扩散性:线性变换确保良好的扩散特性
实现考虑
- 预计算:轮密钥可在加密前预计算并存储
- 资源优化:在资源受限环境中可动态计算轮密钥
- 并行性:密钥扩展过程支持一定程度的并行计算
示例说明
假设初始密钥MK = (MK0, MK1, MK2, MK3),密钥扩展过程为:
- 加载系统参数:K0 = MK0 ⊕ FK0, ...
- 第1轮:rk[0] = K4 = K0 ⊕ T'(K1 ⊕ K2 ⊕ K3 ⊕ CK[0])
- 第2轮:rk[1] = K5 = K1 ⊕ T'(K2 ⊕ K3 ⊕ K4 ⊕ CK[1])
- 依此类推,直到生成全部32个轮密钥
这个密钥扩展算法确保了SM4算法的安全性,通过多轮非线性迭代和固定的系统参数,为加密过程提供了高质量的轮密钥序列。