概述

SM4是一种分组密码,由我国国家密码管理局在2012年发布,常用于无线互联网加密等领域.

SM4是分组密码,分组长度为128bit(即16byte,4word),密钥长度也为128bit(即16byte,4word).

加解密过程经过32轮迭代(类似DES,AES),每一轮也都需要一个轮密钥.

加密过程

加密过程由32轮迭代和1次反序变换组成.

32轮迭代

解释:

  1. 对4字(16byte)明文进行32轮迭代,每轮迭代都需要一个字(4byte)的轮密钥,即共需要32个轮密钥,记为(rk0,rk1,rk2,……,rk31),因此需要进行密钥扩展.

  2. 迭代即使用轮函数F不断向后计算下一个字.SM4的轮函数F接受4个1字数据和一个1字轮密钥,最终生成一个字的结果.

第一轮迭代即使用前4字(X0-X3)计算第5个字X4;第二轮迭代即使用(X1-X4)计算第6个字X5;以此类推,最终生成36个字的结果,完成第一步,过程如下:

X4+i=F(Xi,Xi+1,Xi+2,Xi+3,rki) (i[0,31])X_{4+i}=F(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)\ (i\in[0,31])

一次反序变换

第二步为一次简单的反序变换,将最后生成的4字(X32,X33,X34,X35)进行反序,即得到最终的密文(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)

解密过程

解密过程与加密过程完全相同,也需要32次迭代和1次反序变换,只不过在迭代时要将,轮密钥逆序使用.

密钥扩展和轮函数F

密钥扩展

SM4的原始密钥为128位(4字),根据原始密钥扩展为32个1字子密钥.

与系统参数异或-初始化密钥

将原始密钥的每个字MKiMK_i与系统参数FKiFK_i异或,得到4个新字(K0,K1,K2,K3)(K_0,K_1,K_2,K_3),即:

(K0,K1,K2,K3)=(MK0FK0,MK1FK1,MK2FK2,MK3FK3)(K_0,K_1,K_2,K_3) = (MK_0 \oplus FK_0,MK_1 \oplus FK_1,MK_2 \oplus FK_2,MK_3 \oplus FK_3)

FK为: 0xA3B1BAC6,0x56AA3350,0x677D9197,0xB27022DC

轮迭代生成轮密钥

根据(K0,K1,K2,K3)(K_0,K_1,K_2,K_3)进行32轮迭代,生成32个轮密钥.公式如下:

rki=Ki+4=KiT(Ki+1Ki+2Ki+3CKi) (i=0,1,2,...,31)rk_i = K_{i+4} = K_i \oplus T^{'}(K_{i+1} \oplus K_{i+2} \oplus K_{i+3} \oplus CK _i)\ (i = 0,1,2,...,31)

合成置换TT^{'}

该置换与加密过程的合成置换TT完全类似.

非线性变换τ\tau

非线性变换τ\tau与加密过程中的完全相同

线性变换LL^{'}

线性变换LL^{'}略有不同:

L(B)=B(B<<<13)(B<<<23)L^{'}(B) = B \oplus (B<<<13) \oplus (B<<<23)

32个固定参数CK为(后缀h代表16进制数):

image-20240115125211392

轮函数F

F函数定义

F(Xi,Xi+1,Xi+2,Xi+3,rki)=XiT(Xi+1Xi+2Xi+3rki)F(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i) = X_i \oplus T(X_{i+1} \oplus X_{i+2} \oplus X_{i+3} \oplus rk_i)

其中T()为合成置换.

合成置换T

合成置换T接受1字的输入A,得到1字的输出C.包含非线性变换τ\tau和线性变换LL两部分.

非线性变换τ\tau

非线性变换即对入参A(1字/4byte)进行S盒变换,输出结果B(1字/4byte).S盒如下:

image-20240115121103438

对于输入的每个字节,使用其16进制表示,高位(即二进制高4位)作为行坐标,低位(即二进制低4位)作为列坐标,替换为S盒中对应值.

线性变换LL

线性变换LL使用循环左移(使用<<<符号代表)和异或,公式如下:

C=L(B)=B(B<<<2)(B<<<10)(B<<<18)B(<<<24)C = L(B) = B \oplus (B<<<2) \oplus (B<<<10) \oplus (B<<<18) \oplus B(<<<24)

经过非线性变换τ\tau和线性变换LL,即完成一次合成置换T.