SM4分组密码算法的轮密钥生成过程详解
我将详细讲解SM4分组密码算法的轮密钥生成过程,这个算法是中国国家密码管理局发布的分组密码标准。
一、算法基础
SM4采用32轮非线性迭代结构,分组长度128位,密钥长度128位。轮密钥生成过程将128位初始密钥扩展为32个32位的轮密钥。整个过程包含两个关键部分:系统参数FK、固定参数CK,以及密钥扩展算法本身。
二、系统参数与固定参数
-
系统参数FK = (FK0, FK1, FK2, FK3)
FK0 = 0xA3B1BAC6
FK1 = 0x56AA3350
FK2 = 0x677D9197
FK3 = 0xB27022DC -
固定参数CK(0)到CK(31)
共32个固定参数,每个32位,通过以下方法生成:
设cki,j为CK(i)的第j字节(j=0,1,2,3),则:
cki,j = (4i+j)×7 mod 256
然后将四个字节组合成32位字
三、初始密钥处理
设初始密钥MK = (MK0, MK1, MK2, MK3),每个MKi为32位
首先进行初始变换:
(K0, K1, K2, K3) = (MK0⊕FK0, MK1⊕FK1, MK2⊕FK2, MK3⊕FK3)
四、轮密钥迭代生成
对于i=0到31,按以下步骤生成轮密钥rki:
-
临时值计算:
T' = Ki+1 ⊕ Ki+2 ⊕ Ki+3 ⊕ CKi -
T'经过非线性变换τ:
T = τ(T') = L( Sbox(T') )其中:
- Sbox是SM4的S盒变换,对T'的每个字节进行非线性替换
- L是线性变换:L(B) = B ⊕ (B<<<13) ⊕ (B<<<23)
-
计算下一轮密钥材料:
Ki+4 = Ki ⊕ T -
轮密钥输出:
rki = Ki+4
五、完整流程示例
以第0轮为例:
- 计算T' = K1 ⊕ K2 ⊕ K3 ⊕ CK0
- 对T'进行S盒替换:将T'的4个字节分别通过S盒
- 对S盒输出进行线性变换L
- 计算K4 = K0 ⊕ T
- 轮密钥rk0 = K4
六、关键特性分析
- 密钥扩展与加解密结构相似,都采用32轮Feistel结构
- 每个轮密钥依赖于前4个密钥状态字
- 非线性变换τ与加密轮函数中的T变换结构相同
- 系统参数FK确保密钥扩展的随机性
- 固定参数CK提供每轮不同的轮常量
七、安全性考虑
- 轮密钥间具有充分的非线性关系
- 密钥扩展过程不可逆,从轮密钥难以推导主密钥
- 每轮使用不同的CK值,确保轮密钥的差异性
- 满足白化需求,抵抗相关密钥攻击
这个轮密钥生成过程保证了SM4算法在加解密过程中使用32个不同的轮密钥,为加密提供了必要的密钥材料,同时保持了足够的安全性。