中国商用密码算法SM4

本文详细介绍中国商用密码算法SM4。2006年我国公布该算法,意义重大。它是分组算法,数据和密钥长度均为128比特,加解密采用32轮迭代结构。文中阐述了其基本运算、密码部件、轮函数、密钥扩展算法,还介绍了加解密过程及对合性和可逆性。

中国商用密码算法SM4

2006年我国国家密码管理局公布了无线局域网产品使用的SM4密码算法。这是我国第一次公布自己的商用密码算法,意义重大,影响深远。这一举措标志着我国商用密码管理更加科学化和国际接轨。

SM4密码算法设计简洁,算法结构有特点,安全高效。它的公开颁布向世界展示了我国在商用密码方面的研究成果。

1. SM4算法描述

SM4算法是一个分组算法。数据分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展都采用32轮迭代结构。SM4以字节(8比特)和字(32比特)位单位进行数据处理。它是对合算法,因此加解密算法相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

1.1 基本运算

SM4算法使用模2加循环移位作为基本运算。

1.2 基本密码部件

SM4密码算法使用了以下基本密码部件

  1. S盒

    SM4的S盒是一种以字节为单位的非线性代替变换,其密码学的作用是起混淆作用。S盒的输入和输出都是8位的字节。它的本质上是8位的非线性置换。例如S盒输入为EF,则取第E行第F列交点处的值进行替换。

    S盒

  2. 非线性变换τ\tauτ

    SM4的非线性变换τ\tauτ 是一种以字为单位的非线性变换。它由4个S盒并置构成。这里的非线性变换就和之前zuc的S盒变换原理相同,一个字有4个字节,每个字节都使用S盒进行变化,再将结果进行首尾连接。不同的是ZUC使用的是两个S盒,这里只有一个S盒。

  3. 线性变换LLL

    线性变换LLL是以字为处理单位的线性变换部件,其输入输出都是32位的字。其密码学的作用是起扩散作用。

    LLL的输入为字B,输出为字C,则:
    C=L(B)=B⨁(B<<<2)⨁(B<<<10)⨁(B<<<18)⨁(B<<<24) C=L(B)=B\bigoplus(B<<<2)\bigoplus(B<<<10)\bigoplus(B<<<18)\bigoplus(B<<<24) C=L(B)=B(B<<<2)(B<<<10)(B<<<18)(B<<<24)

  4. 合成变换TTT

    合成变换是由非线性变换τ\tauτ 和线性变换L复合而成。
    T(X)=L(τ(X)) T(X)=L(\tau(X)) T(X)=L(τ(X))
    合成变换TTT起到混淆和扩散作用,提高密码安全性。

1.3 轮函数

SM4密码算法的轮函数是一种以字为处理单位的密码函数。

设轮函数FFF的输入为(X0,X1,X2,X3)(X_0,X_1,X_2,X_3)(X0,X1,X2,X3),四个32位字,共128位。轮密钥为rkrkrkrkrkrk也是一个32位的字。其输出也是32位的字。
F(X0,X1,X2,X3)=X0⨁T(X1⨁X2⨁X3⨁rk) F(X_0,X_1,X_2,X_3) = X_0\bigoplus T(X_1\bigoplus X_2\bigoplus X_3\bigoplus rk) F(X0,X1,X2,X3)=X0T(X1X2X3rk)
轮函数

1.4 密钥扩展算法

SM4密码使用128位的加密密钥,并采用32轮迭代加密结构,每一轮加密使用一个32位的轮密钥,共使用32个轮密钥。因此需要使用密钥扩展算法。

  1. 系统参数FK

    在密钥扩展中使用如下的参数:

    FK0=(A3B1BAC6),FK1=(56AA3350),FK2=(677D9197),FK3=(B27022DC),

  2. 固定参数CK

    共使用32个固定参数CKi,CKi是一个字,其产生规则如下:

    设cki,j 为CKi的第j字节( i = 0,1,…,31; j=0,1,2,3 ),即CKi = ( cki,0 , cki,1 , cki,2 , cki,3 ),则
    cki,j=(4i+j)×7(mod256) ck_{i,j}=(4i+j)\times 7(mod 256) cki,j=(4i+j)×7(mod256)
    这32个固定参数如下(16进制):

    00070e151c232a31383f464d545b6269
    70777e858c939aa1a8afb6bd545b6269
    e0e7eef5fc030a11181f262d343b4249
    50575e656c737a81888f969da4abb2b9
    c0c7ced5dce3eaf1f8ff060d141b2229
    30373e454c535a61686f767d848b9299
    a0a7aeb5bcc3cad1d8dfe6edf4fb0209
    10171e252c333a41484f565d646b7279
  3. 密钥扩展算法

    设输入加密密钥为MK = ( MK0,MK1,MK2,MK3),输出轮密钥为rkirk_irkii=0,1,...,31i=0,1,...,31i=0,1,...,31,中间数据为KiK_iKii=0,1,...,34,35i=0,1,...,34,35i=0,1,...,34,35。则密钥扩展算法为:

    1. (K0,K1,K2,K3)=(MK0⨁FK0,MK1⨁FK1,MK2⨁FK2,MK3⨁FK3)(K_0,K_1,K_2,K_3)=(MK_0\bigoplus FK_0,MK_1\bigoplus FK_1,MK_2\bigoplus FK_2,MK_3\bigoplus FK_3)(K0,K1,K2,K3)=(MK0FK0,MK1FK1,MK2FK2,MK3FK3)

    2. for(i=0;i<32;i++)for(i=0;i<32;i++)for(i=0;i<32;i++)

      rki=Ki+4=Ki⨁T′(Ki+1⨁Ki+2⨁Ki+3⨁CKi)rk_i=K_{i+4}=K_i\bigoplus T^{'}(K_{i+1}\bigoplus K_{i+2}\bigoplus K_{i+3}\bigoplus CK_i)rki=Ki+4=KiT(Ki+1Ki+2Ki+3CKi)

      其中T′T^{'}T的变换与加密函数中的TTT基本相同,只是将其中的线性变换LLL修改为L′L^{'}L
      L′(B)=B⨁(B<<<13)⨁(B<<<23) L^{'}(B)=B\bigoplus (B<<<13)\bigoplus (B<<<23) L(B)=B(B<<<13)(B<<<23)
      分析密钥扩展算法可以发现,在算法结构方面密钥扩展算法与加密算法类似,也是采用了32轮类似的迭代处理。

    特别应当注意的是在密钥扩展算法中采用了非线性变化τ\tauτ ,这将大大加强密钥扩展的安全性。

2. SM4加密过程

SM4密码算法是一个分组算法。数据分组长度为128比特,密钥长度为128比特。加密算法采用32轮迭代结构,每轮使用一个轮密钥。

设输入的明文为(X0,X1,X2,X3)(X_0,X_1,X_2,X_3)(X0,X1,X2,X3),输入轮密钥为rkirk_irkii=0,1,..,31i=0,1,..,31i=0,1,..,31,共32个字。输出的密文为(Y0,Y1,Y2,Y3)(Y_0,Y_1,Y_2,Y_3)(Y0,Y1,Y2,Y3)

加密算法为:
Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=Xi⨁T(Xi+1⨁Xi+2⨁Xi+3⨁rki) X_{i+4}=F(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)=X_i\bigoplus T(X_{i+1}\bigoplus X_{i+2}\bigoplus X_{i+3}\bigoplus rk_i) Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=XiT(Xi+1Xi+2Xi+3rki)
为了与解密算法需要的顺序一致,在加密算法之后还需要一个反序处理RRR
R(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32) R(Y_0,Y_1,Y_2,Y_3)=(X_{35},X_{34},X_{33},X_{32}) R(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)
加密算法流程如下:
SM4加密

从图中可以看出,SM4一次加密处理4个字,产生一个字的中间密文,这个中间密文,这个中间密文与前三个字拼接在一起供下一次加处理,共迭代32轮,最终产生出四个字的密文。

加密过程也可如下所示:

加密过程

3. SM4解密过程

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

设输入密文为(Y0,Y1,Y2,Y3)(Y_0,Y_1,Y_2,Y_3)(Y0,Y1,Y2,Y3),输入轮密钥为rkirk_irkii=31,30,...,1,0i=31,30,...,1,0i=31,30,...,1,0,输出明文为(M0,M1,M2,M3)(M_0,M_1,M_2,M_3)(M0,M1,M2,M3)。由(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)(Y_0,Y_1,Y_2,Y_3)=(X_{35},X_{34},X_{33},X_{32})(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) X_i=F(X_{i+4},X_{i+3},X_{i+2},X_{i+1},rk_i)=X_{i+4}\bigoplus T(X_{i+3}\bigoplus X_{i+2}\bigoplus X_{i+1}\bigoplus rk_i) Xi=F(Xi+4,Xi+3,Xi+2,Xi+1,rki)=Xi+4T(Xi+3Xi+2Xi+1rki)

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

与加密算法之后需要一个反序处理同样的道理,在解密算法之后也需要有一个反序处理RRR:
R(M0.M1,M2,M3)=(X3,X2,X1,X0) R(M_0.M_1,M_2,M_3)=(X_3,X_2,X_1,X_0) R(M0.M1,M2,M3)=(X3,X2,X1,X0)
解密过程可如下所示:

在这里插入图片描述

4. SM4的对合性和可逆性

可逆性是对称密码算法的基本要求,对合性能够使密码算法实现的工作量减半。

4.1 SM4对合性

先分析SM4的加密轮函数,如图所示,它由两个运算组成:

轮函数

加密函数G的运算可以写成:
G=Gi(Xi,Xi+1,Xi+2,Xi+3,rki)=(Xi⨁T(Xi+1,Xi+2,Xi+3,rki),Xi+1,Xi+2,Xi+3) G=G_i(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)\\ \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad =(X_i\bigoplus T(X_{i+1}, X_{i+2}, X_{i+3}, rk_i),X_{i+1}, X_{i+2}, X_{i+3}) G=Gi(Xi,Xi+1,Xi+2,Xi+3,rki)=(XiT(Xi+1,Xi+2,Xi+3,rki),Xi+1,Xi+2,Xi+3)

(Gi)2=Gi(Xi⨁T(Xi+1,Xi+2,Xi+3,rki),Xi+1,Xi+2,Xi+3,rki)=(Xi⨁T(Xi+1,Xi+2,Xi+3,rki)⨁T(Xi+1,Xi+2,Xi+3,rki),Xi+1,Xi+2,Xi+3,rki)=(Xi,Xi+1,Xi+2,Xi+3,rki)=I(G_i)^2=G_i(X_i\bigoplus T(X_{i+1}, X_{i+2}, X_{i+3}, rk_i), X_{i+1}, X_{i+2}, X_{i+3},rk_i)\\ \quad \quad =(X_i\bigoplus T(X_{i+1}, X_{i+2}, X_{i+3}, rk_i)\bigoplus T(X_{i+1}, X_{i+2}, X_{i+3},rk_i),X_{i+1}, X_{i+2}, X_{i+3},rk_i)\\ \quad \quad=(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)\\ \quad \quad =I(Gi)2=Gi(XiT(Xi+1,Xi+2,Xi+3,rki),Xi+1,Xi+2,Xi+3,rki)=(XiT(Xi+1,Xi+2,Xi+3,rki)T(Xi+1,Xi+2,Xi+3,rki),Xi+1,Xi+2,Xi+3,rki)=(Xi,Xi+1,Xi+2,Xi+3,rki)=I

III是恒等变换,可以看出加密函数Gi是对合运算。

数据交换E的运算可以写成:
E=(Xi+4,(Xi+1,Xi+2,Xi+3))=((Xi+1,Xi+2,Xi+3),Xi+4) E=(X_{i+4},(X_{i+1},X_{i+2},X_{i+3}))=((X_{i+1},X_{i+2},X_{i+3}),X_{i+4}) E=(Xi+4,(Xi+1,Xi+2,Xi+3))=((Xi+1,Xi+2,Xi+3),Xi+4)
显然E=E−1E=E^{-1}E=E1,即EEE是对合运算。

因此,加密轮函数可以写成:
Fi=Fi(Xi,Xi+1,Xi+2,Xi+3,rki)=GiE F_i=F_i(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)=G_iE Fi=Fi(Xi,Xi+1,Xi+2,Xi+3,rki)=GiE
则加密的过程可以写成:
SM4=G0EG1E...G30EG31R SM4=G_0EG_1E...G_{30}EG_{31}R SM4=G0EG1E...G30EG31R
解密过程可以写成:
SM4−1=G31EG30E...G1EG0R SM4^{-1}=G_{31}EG_{30}E...G_1EG_0R SM41=G31EG30E...G1EG0R
比较加解密式子可以发现二者是相同的,只是密钥的使用顺序相反。这就说明SM4算法是对合运算。

4.2 SM4可逆性

加密过程可以写为:

(X0,X1,X2,X3)(X_0,X_1,X_2,X_3)(X0,X1,X2,X3)–>(X1,X2,X3,X4)(X_1,X_2,X_3,X_4)(X1,X2,X3,X4)–>(X2,X3,X4,X5)(X_2,X_3,X_4,X_5)(X2,X3,X4,X5)–>…–>(X32,X33,X34,X35)(X_{32},X_{33},X_{34},X_{35})(X32,X33,X34,X35)–>(X35,X34,X33,X32)(X_{35},X_{34},X_{33},X_{32})(X35,X34,X33,X32)=(Y0,Y1,Y2,Y3)(Y_0,Y_1,Y_2,Y_3)(Y0,Y1,Y2,Y3)

其中最后一步为反序。

同理,解密过程可以写为:

(X35,X34,X33,X32)(X_{35},X_{34},X_{33},X_{32})(X35,X34,X33,X32)–>(X34,X33,X32,X31)(X_{34},X_{33},X_{32},X_{31})(X34,X33,X32,X31)–>(X33,X32,X31,X30)(X_{33},X_{32},X_{31},X_{30})(X33,X32,X31,X30)–>…–>(X3,X2,X1,X0)(X_3,X_2,X_1,X_0)(X3,X2,X1,X0)–>(X0,X1,X2,X3)(X_0,X_1,X_2,X_3)(X0,X1,X2,X3)

其中最后一步为反序。

由此可以得出:
SM4−1(SM4(X0,X1,X2,X3))=(X0,X1,X2,X3) SM4^{-1}(SM4(X_0,X_1,X_2,X_3))=(X_0,X_1,X_2,X_3) SM41(SM4(X0,X1,X2,X3))=(X0,X1,X2,X3)
因此SM4是可逆的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值