概述
SM4是一种分组密码,由我国国家密码管理局在2012年发布,常用于无线互联网加密等领域.
SM4是分组密码,分组长度为128bit(即16byte,4word),密钥长度也为128bit(即16byte,4word).
加解密过程经过32轮迭代(类似DES,AES),每一轮也都需要一个轮密钥.
加密过程
加密过程由32轮迭代和1次反序变换组成.
32轮迭代
解释:
-
对4字(16byte)明文进行32轮迭代,每轮迭代都需要一个字(4byte)的轮密钥,即共需要32个轮密钥,记为(rk0,rk1,rk2,……,rk31),因此需要进行密钥扩展
.
-
迭代即使用轮函数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])
一次反序变换
第二步为一次简单的反序变换,将最后生成的4字(X32,X33,X34,X35)进行反序,即得到最终的密文(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)
解密过程
解密过程与加密过程完全相同,也需要32次迭代和1次反序变换,只不过在迭代时要将,轮密钥逆序使用.
密钥扩展和轮函数F
密钥扩展
SM4的原始密钥为128位(4字),根据原始密钥扩展为32个1字子密钥.
与系统参数异或-初始化密钥
将原始密钥的每个字MKi与系统参数FKi异或,得到4个新字(K0,K1,K2,K3),即:
(K0,K1,K2,K3)=(MK0⊕FK0,MK1⊕FK1,MK2⊕FK2,MK3⊕FK3)
FK为: 0xA3B1BAC6,0x56AA3350,0x677D9197,0xB27022DC
轮迭代生成轮密钥
根据(K0,K1,K2,K3)进行32轮迭代,生成32个轮密钥.公式如下:
rki=Ki+4=Ki⊕T′(Ki+1⊕Ki+2⊕Ki+3⊕CKi) (i=0,1,2,...,31)
合成置换T′
该置换与加密过程的合成置换T完全类似.
非线性变换τ
非线性变换τ与加密过程中的完全相同
线性变换L′
线性变换L′略有不同:
L′(B)=B⊕(B<<<13)⊕(B<<<23)
32个固定参数CK为(后缀h代表16进制数):
轮函数F
F函数定义
F(Xi,Xi+1,Xi+2,Xi+3,rki)=Xi⊕T(Xi+1⊕Xi+2⊕Xi+3⊕rki)
其中T()为合成置换
.
合成置换T
合成置换T接受1字的输入A,得到1字的输出C.包含非线性变换τ和线性变换L两部分.
非线性变换τ
非线性变换即对入参A(1字/4byte)进行S盒变换
,输出结果B(1字/4byte).S盒如下:
对于输入的每个字节,使用其16进制表示,高位(即二进制高4位)作为行坐标,低位(即二进制低4位)作为列坐标,替换为S盒中对应值.
线性变换L
线性变换L使用循环左移(使用<<<符号代表)和异或,公式如下:
C=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕B(<<<24)
经过非线性变换τ和线性变换L,即完成一次合成置换T.