0%

SM4 分组密码算法简介

SM4 算法是我国商用分组密码算法,被广泛用于无线网络数据加密传输中。SM4 算法的密钥长度和分组长度均为 128 比特,解密算法是加密算法的逆运算,只需将轮密钥逆序输入即可得到明文。SM4 与 AES 算法的比较如表 1 所示。

表 1 SM4 与 AES 算法比较

算法 加密轮数 密钥长度(比特) 分组长度(比特)
SM4 32 128 128
AES-128 10 128 128
AES-192 12 192 128
AES-256 14 256 128

SM4 加密算法

为了方便说明,本文定义 Z2m 表示 m 比特向量,符号 表示异或运算。设明文输入为 X=(X0,X1,X2,X3)(Z232)4 ,密文输出为 Y=(Y0,Y1,Y2,Y3)(Z232)4 ,轮密钥为 rkiZ232,i=0,1,,31 ,则 SM4 加密算法表示为:

Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=XiT(Xi+1Xi+2Xi+3rki)i=0,1,,31Y=(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)

其中,T 是一个 Z232Z232 的合成变换,包含线性变换 L 和 非线性变换 τ ,即:T(x)=L(τ(x))

  1. 非线性变换 τ 由 4 个并行的 8 进 8 出的 S 盒查表组成,设输入为 x=(x0,x1,x2,x3)(Z28)4 ,输出为 y=(y0,y1,y2,y3)(Z28)4 ,则:

    (y0,y1,y2,y3)=τ(x)=(S(x0),S(x1),S(x2),S(x3))

    对于 S 盒的 8 位输入,将前 4 位作为行,后 4 位作为列,输出即为查找表中对应行列所对应的 值。S 盒如图 1 所示:

    image-20210905154433201

    图 1 S 盒

  2. 线性变换 L 接收非线性变换 τ 的输出作为输入,设线性变换 L 的输出为 zZ232 ,则:

    z=L(y)=y(y2)(y10)(y18)(y24)

    其中, 表示循环左移,如 y2 表示将 y 循环左移 2 位。

SM4 密钥扩展算法

SM4 算法使用密钥扩展算法对初始密钥进行扩展生成各轮子密钥。令初始密钥表示为 MK=(MK0,MK1,MK2,MK3)(Z232)4 ,则按如下方式生成 32 轮子密钥:

(K0,K1,K2,K3)=(MK0FK0,MK1FK1,MK2FK2,MK3FK3)rki=Ki+4=KiT(Ki+1Ki+2Ki+3CKi)i=0,1,,31

其中:

  1. T=L(τ())L 表示为:

    L(B)=B(B13)(B23)
  2. FK 是系统参数,取值为:

    FK0=(A3B1BAC6),FK1=(56AA3350)FK2=(677D9197),FK3=(B27022DC)
  3. CK 是固定参数,其构造方法为:

    CKi 的第 j 个字节为 cki,ji=0,1,,31;j=0,1,2,3 ,即 CKi=(cki,0,cki,1,cki,2,cki,3)(Z28)4 ,那么有:

    cki,j=(4i+j)7(mod256)

    根据此计算方法,可以计算出所有的 CK 值,即:

    00070E15, 1C232A31, 383F464D, 545B6269,

    70777E85, 8C939AA1, A8AFB6BD, C4CBD2D9,

    E0E7EEF5, FC030A11, 181F262D, 343B4249,

    50575E65, 6C737A81, 888F969D, A4ABB2B9,

    C0C7CED5, DCE3EAF1, F8FF060D, 141B2229,

    30373E45, 4C535A61, 686F767D, 848B9299,

    A0A7AEB5, BCC3CAD1, D8DFE6ED, F4FB0209,

    10171E25, 2C333A41, 484F565D, 646B7279

参考文献

[1] SM4 分组密码算法