当前位置 博文首页 > Champhoenix的博客:SM4算法介绍

    Champhoenix的博客:SM4算法介绍

    作者:[db:作者] 时间:2021-09-07 22:27

    SM4算法介绍
    SM4 算法是一种分组密码算法。其分组长度为 128bit,密钥长度也为 128bit。
    加密算法与密钥扩展算法均采用 32 轮非线性迭代结构,以字(32 位)为单位进
    行加密运算,每一次迭代运算均为一轮变换函数 F。SM4 算法加/解密算法的结构
    相同,只是使用轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。

    SM4 的加密算法

    SM4 密码算法的数据分组长度为 128 比特,密钥长度也是 128 比特,是分组算法当中的一种。它采用 32 轮迭代结构来作为它的加密算法,每轮使用一个轮密钥。设输入的明文为四个字(X0,X1,X2, X3),一共有 128 位。输入轮密钥为rki,i=0,1,…,31,一共 32 个字。输出密文为四个字(Y0,Y1,Y2, Y3),128 位。

    则这个加密算法可描述如下。

    加密算法:
    在这里插入图片描述
    SM4 加密算法的框图为图所示

    在这里插入图片描述
    SM4 的加密算法和 DES、AES 的结构一样,均采用了基本函数迭代,但 SM4 也有一些不同的加密迭代处理特点。由图可以看出,SM4 的加密法代处理方式具有密文反馈连接和流密码的某一些特点,前一轮加密的结果与前一轮的加密数据拼接起来供下一轮加密处理。一次加密处理四个字,然后产生一个字的中间密文,这个中间密文和前三个字拼接起来后再供下一次加密处理,一共会迭代加密处理32 轮,产生出四个字的密文。这个加密处理的整个过程就像一个宽度为 4 个字的窗口在滑动,加密处理完一轮,窗口就滑动一个字,窗口一共滑动 32 次后加密迭代就结束了。

    SM4 的解密算法

    由于 SM4 密码算法的运算是对合运算,所以它的解密算法结构是和加密算法的结构一样的,不同的是轮密钥的使用顺序,解密和加密的是相反的,也就是说解密的轮密钥是加密的轮密钥的逆序。设输入的密文为(X0,X1,X2, X3),输入轮密钥为 rki,i=31,30,…,1,0,输出的明文为(Y0,Y1,Y2, Y3)。则这个姐密算法可描述如下。

    解密算法:

    在这里插入图片描述
    SM4 的密钥扩展算法

    SM4 密码算法采用 32 轮的迭代加密结构,拥有 128 位加密密钥,一共使用 32轮密钥,每一轮的加密使用 32 位的一个轮密钥。SM4 算法的特点使得它需要使用一个密钥扩展算法,在加密密钥当中产生 32 个轮密钥。在这个密钥的扩展算法当中有常数 FK、固定参数 CK 这两个数值,利用这两个数值便可完成它的这一个扩展算法。

    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) , 即CKj=(cki,0,cki,1,cki,2,cki,3),
    则 cki,j=(4i+j)×7(mod 256)

    这 32 个固定参数如下(十六进制) :

    00070e15, 1c232a31, 383f64d, 545b6269,
    70777e85, 8c939aa1, a8afb6bd, c4cbd2d9,
    e0e7eef5, fc030a11, 181f262d, 343b4249,
    50575e65, 6c737a81, 888f969d, a4abb2b9,
    c0c7ced5, dce3eafl, f8ff060d, 141b2229,
    30373e45, 4c535a61, 686f767d, 848b9299,
    a0a7aeb5, bcc3cad1, d8dfe6ed, f4fb0209,
    10171e25, 2c333a41, 484f565d, 646b7279。

    3.密钥扩展算法

    假设输入的加密密钥为 MK= (MK0,MK1,MK2,MK3 ),输出的轮密钥为 rki, i=0,1…,30,31,中间的数据为 Ki=0,1,…,34,35。则密钥扩展算法可描述如下。

    密钥扩展算法:

    ①(K0,K1,K2,K3)=(MK0⊕FK0,MK1⊕FK1,MK2⊕FK2,MK3⊕FK3)
    ②For i=0,1,…,30,31 Do
    rki=K(i+4)=Ki⊕T’(K(i+1)⊕K(i+2)⊕K(i+3)⊕CKi)

    说明:其中的 T’变换与加密算法轮函数中的 T 基本相同,只将其中的线性变换L 修改为以下的 L’:

    L’(B)=B⊕(B<<<13)⊕(B<<<23)

    从密钥扩展算法中我们分析后可以发现,密钥扩展算法与加密算法在算法结构方面类似,同样都是采用了 32 轮类似的迭代处理。

    需要特别注意的是密钥扩展算法采用了非线性变换 T,这个措施将会使密钥扩展的安全性大大地加强了。在这方面上 SM4 和 AES 密码类似,而 DES 的子密钥生产算法并没有采用这种类似措施。

    cs