SM4算法详解
分组密码将明文数据按固定长度进行分组,并在同一密钥控制下逐组进行加密,从而将各个明文分组变换成一个个等长的密文分组。
分组密码的设计一般基于混淆原则和扩散原则。
混淆原则指的是将密文、明文、密钥三者之间的统计关系和代数关系变得尽可能复杂,使敌手即使获得了密文和明文,也无法求出密钥的任何信息,即使获得了密文和明文的统计规律,也无法求出明文的任何信息。
扩散原则是将明文的统计规律和结构规律散射到相当长的一段统计中去。即,明文中的每一位会影响密文中的尽可能多的位,或者说让密文中的每一位都受到明文中的尽可能多位的影响。
分组密码主要的应用场景,包括无需进行密钥交换;防止明文传输过程被窃取;数据量大,加解密速度要求快等场景。
SM4算法流程
SM4算法主要包括异或、移位以及盒变换操作。其中密钥拓展和加/解密为两个主要模块,其流程大同小异。
其中,移位变换是指循环左移;盒变换将8bit输入映射到8bit输出的变换,是一个固定的变换。
下图1给出了 SM4算法的加解密(左)和密钥拓展(右)的流程图。
(1)加/解密模块
加/解密算法由32次迭代运算和1次反序变换组成,具体步骤如下所述。
设,明文输入为 ( X 0 , X 1 , X 2 , X 3 ) (X_0, X_1, X_2, X_3) (X0,X1,X2,X3), X i X_i Xi为32 比特的数据,密文输出为 ( Y 0 , Y 1 , Y 2 , Y 3 ) (Y_0, Y_1, Y_2, Y_3) (Y0,Y1,Y2,Y3),轮密钥为 r k i rk_i rki。
① 当 i = 0 i=0 i=0 时为第一次轮变换,一直进行到 i = 31 i=31 i=31 结束。
②将 X i + 1 , X i + 2 , X i + 3 X_{i+1} , X_{i+2} , X_{i+3} Xi+1,Xi+2,Xi+3 和轮密钥 r k i rk_i rki 异或得到一个 32 32 32 比特的数据,作为盒变换的输入。即, s b o x i n p u t = X i + 1 ⊕ X i + 2 ⊕ X i + 3 ⊕ r k i sbox_{input} = X_{i+1} ⊕ X_{i+2} ⊕ X_{i+3}⊕rk_i sboxinput=Xi+1⊕Xi+2⊕Xi+3⊕rki, ⊕ ⊕ ⊕ 符号代表异或运算。
③ 将 s b o x i n p u t sbox_{input} sboxinput 拆分成 4 4 4个 8 8 8比特数据,分别进行盒变换,之后再将 4 4 4个 8 8 8比特输出合并成一个 32 32 32 比特的 s b o x o u t p u t sbox_{output} sboxoutput。
④ 将上一步获得的 s b o x o u