国密算法我们已经介绍了SM1、SM2、SM3,那么今天我们就来了解一下SM4分组加密算法。

什么是SM4?

SM4 为无线局域网标准的分组加密算法,用于替代 DES/AES 等国际算法,是继SM2、SM3、SM9、祖冲之密码算法之后,又一个商用密码算法被纳入ISO/IEC国际标准。

SM4加密过程

SM4是一种分组密码算法,其分组长度为128位(即16字节,4字),密钥长度也为128位。其加解密过程采用了32轮迭代机制,每一轮需要一个轮密钥,这些均与DES、AES类似。

设输入的明文为( X0 , X1 , X2 , X3 ),输入轮密钥为rki,i = 0 , 1 , . . , 31,共32个字。输出的密文为( Y0 , Y1 , Y2 , Y3 ) 。

加密算法为:Xi+4=F(Xi,X i+1,Xi+2,X i+3,rki)=Xi⨁T(X i+1⨁Xi+2⨁Xi+3⨁rki)

SM4

密钥:加密密钥的长度为128比特,表示为MK = (MK0, MK1, MK2, MK3),其中MKi为32位,轮密钥表示为(rk0, rk1, ……, rk31),其中rki为32位。

轮函数F:假设输入为(X0, X1, X2, X3),Xi 为32位,则轮函数F为:F=(X0, X1, X2, X3, rk) = X0 ⊕ T(X1 ⊕ X2 ⊕ X3 ⊕ rk)

合成置换:T函数是一个可逆变换,由一个非线性变换r和线性变换L复合而成的,即T( )=L(r( ))

非线性变换有四个并行的S盒构成的,设输入为A=(a0, a1, a2, a3),输出为B=(b0, b1, b2, b3),其中ai和bi为8位。每个S盒的输入都是一个8位的字节,将这8位的前四位对应的16进制数作为行编号,后四位对应的16进制数作为列编号,然后用相应位置中的字节代替输入的字节。下图为S盒置换表:

SM4

线性变换L:线形变换的输入就是S盒的输出,即C=L(B)=B ⊕ (B<<<2) ⊕ (B<<<10) ⊕ (B<<<18) ⊕ (B<<<24),线性变换的输入和输出都是32位的。

经过了32轮的迭代运算后,最后再进行一次反序变换即可得到加密的密文,即密文C=(Y0, Y1, Y2, Y3)=R(X32. X33, X34, X35)=(X35, X34, X33, X32)。

SM4解密过程

SM4密码算法是对合运算,因此加解密算法相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

设输入密文为( Y0 , Y1 , Y2 , Y3 ),输入轮密钥为rki,i =31,30,...,1,0,输出明文为(M0,M1,M2,M3)。由( Y0 , Y1 , Y2 , Y3 )=(X35,X34,X33,X32),得解密算法为:

Xi=F(Xi+4,Xi+3,Xi+2,Xi+1,rki)=Xi+4⨁T(Xi+3⨁Xi+2⨁Xi+1⨁rki)

i=31,30,..,1,0

与加密算法之后需要一个反序处理同样的道理,在解密算法之后也需要有一个反序处理R:

R(M0.M1,M2,M3)=(X3,X2,X1,X0)

SM4

SM4的应用场景

  • 无需进行密钥交换的场景,如内部系统,事先就可以直接确定密钥;
  • 防止明文传输数据被窃取的场景;
  • 加解密速度快,适合数据内容比较大的加密场景。

免责声明:素材源于网络,如有侵权,请联系删稿。