好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

国密SM4算法

与DES和AES算法相似,国密SM4算法是一种分组加密算法。SM4分组密码算法是一种迭代分组密码算法,由加解密算法和密钥扩展算法组成。

SM4是一种Feistel结构的分组密码算法,其分组长度和密钥长度均为128bits。加密算法和密钥扩展算法迭代轮数均为32轮。SM4加解密过程的算法相同但是轮密钥的使用顺序相反。

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

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

SM4加解密流程

SM4算法的加密大致流程如下:

密钥:加密密钥的长度为128比特,表示为MK = (MK 0 , MK 1 , MK 2 , MK 3 ),其中MK i 为32位,轮密钥表示为(rk 0 , rk 1 , ……, rk 31 ),其中rk i 为32位。

轮函数F:假设输入为(X 0 , X 1 , X 2 , X 3 ),X i  为32位,则轮函数F为:F=(X 0 , X 1 , X 2 , X 3 , rk) = X 0  ⊕ T(X 1  ⊕ X 2  ⊕ X 3  ⊕ r k )

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

非线性变换有四个并行的S盒构成的,设输入为A=(a 0 , a 1 , a 2 , a 3 ),输出为B=(b 0 , b 1 , b 2 , b 3 ),其中a i 和b i 为8位。每个S盒的输入都是一个8位的字节,将这8位的前四位对应的16进制数作为行编号,后四位对应的16进制数作为列编号,然后用相应位置中的字节代替输入的字节。下图为S盒置换表:

 

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

经过了32轮的迭代运算后,最后再进行一次反序变换即可得到加密的密文,即密文C=(Y 0 , Y 1 , Y 2 , Y 3 )=R(X 32 . X 33 , X 34 , X 35 )=(X 35 , X 34 , X 33 , X 32 )。

SM4算法的解密流程和加密流程一致,只不过轮密钥的使用顺序变成了(rk 31 , rk 30 , ……, rk 0 )

密钥扩展算法

密钥参量:轮密钥由加密密钥生成。FK=(FK 0 , FK 1 , FK 2 , FK 3 )为系统参数,以及固定参数CK=(CK 0,  CK 1 , ……,  CK 31 ),其中FK i 和CK i 均为32位并用于密钥扩展算法。

系统参数FK的具体取值如下:

FK 0 =(A3B1BAC6), FK 1 =(56AA3350), FK 2 =(677D9197), FK 3 =(B27022DC)

固定参数CK的具体取值如下:

密钥扩展方法:设(K 0 , K 1 , K 2 , K 3 )=(MK 0 ⊕FK 0 , MK 1 ⊕FK 1 , MK 2 ⊕FK 2 , MK 3 ⊕FK 3 )

则rk i =K i+4 =K i ⊕T‘(K i+1 ⊕K i+2 ⊕K i+3 ⊕CK i )

其中T’()是将原来的T()中的线形变换L()替换成L'(B)=B⊕(B<<<13)⊕(B<<<23)

查看更多关于国密SM4算法的详细内容...

  阅读:56次