代码改变世界

SM4分组密码算法

2020-09-08 14:35  书书书书君  阅读(10006)  评论(3编辑  收藏  举报

1. SM4算法定义

SM4密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。

  1. 该算法的分组长度为128比特,密钥长度为128比特。(十六进制表示则为32位,明文和密钥等长)

  2. 加密算法与密钥扩展算法都采用32轮非线性迭代结构。

  3. 密钥扩展算法:将加密密钥变换为轮密钥的运算单元。

  4. 数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

2. SM4算法的优势

国密算法SM4有安全高效的特点,在设计与实现方面有以下优势:

  • 对合运算:解密算法与加密算法相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
  • 子密钥生成算法与加密算法结构类似,在设计上做到资源重用。
  • 加密算法与密钥扩展算法都采用32轮非线性迭代结构,将128位的明文、密钥通过32次循环的非线性迭代运算得到最终结果。

3. 加密算法流程

整体流程框架:

或者参考
北卡科技的博客中的流程图
SM4算法结构:

轮密钥生成:

32次非线性迭代:

3.1. 密钥扩展算法

密钥扩展算法:将加密密钥变换为轮密钥的运算单元。

轮密钥 \(rk_i\) 生成方法:

\(rk_i=K_{i+4}=K_i\oplus T'(K_{i+1}\oplus K_{i+2}\oplus K_{i+3}\oplus CK_{i}),\ i=0,1,\cdots,31\)

合成置换 \(T':Z_2^{32} \rightarrow Z_2^{32}\) 是一个可逆变换,由非线性变换 \(\tau\) 和线性变换 \(L'\)复合而成,即 \(T'(\cdot)=L'(\tau(\cdot))\)

线性变换 \(L'\)\(L'(B)=B \oplus (B <<< 13)\oplus (B<<<23)\),其中 \(<<< i\) 表示32位循环左移 \(i\) 位。

非线性变换 \(\tau\)\(\tau (B)\)\(\tau\) 由4个并行的S盒构成。

S盒为固定的8比特输入8比特输出的置换,记为 \(Sbox(\cdot)\)
轮密钥由加密密钥生成。
\(FK = (FK_0,FK_1,FK_2,FK_3)\) 为系统参数[^1],\(CK=(CK_0,CK_1,\cdots,CK_{31})\) 为固定参数[^2],用于密钥扩展算法,其中 \(FK_i\ (i=0,\cdots,3)\)\(CK_i\ (i=0,\cdots,31)\) 为字。

[^1]:系统参数 \(FK\) 的取值为: \(FK_0=(A3B1BAC6),\ FK_1=(56AA3350),\ FK_2=(677D9197),\ FK_3=(B27022DC)\)

[^2]:固定参数 \(CK\) 的取值方法为:设 \(ck_{i,j}\)\(CK_i\) 的第 \(j\) 字节(\(i=0,1,\cdots,31;\ j=0,1,2,3\)),即 \(CK_i=(ck_{i,0},ck_{i,1},ck_{i,2},ck_{i,3})\),则 \(ck_{i,j}=(4i+j)\times 7 (mod 256)\)
固定参数 \(CK_i (i=0,1,\cdots,31)\) 具体值为:

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

非线性变换 \(\tau\)

例如输入为 \(01\ 23\ 45\ 67\),则该 \(\tau\) 变换应为:\(90\ F4\ 73\ A2\)(\(01 \rightarrow 第0行第1列 \rightarrow 90\))

3.2. 轮函数 \(F\) · 32次迭代

轮函数 \(F\) 生成方法:
\(X_{i+4} = F(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i) = X_i \oplus T(X_{i+1}\oplus X_{i+2}\oplus X_{i+3}\oplus rk_i), i=0,1,\cdots,31 \)

合成置换 \(T:Z_2^{32} \rightarrow Z_2^{32}\) 是一个可逆变换,由非线性变换 \(\tau\) 和线性变换 \(L\)复合而成,即 \(T(\cdot)=L(\tau(\cdot))\)

线性变换 \(L\)\(L(B)=B \oplus (B <<< 2)\oplus (B<<<10)\oplus (B<<<18)\oplus (B<<<24)\)

非线性变换 \(\tau\)\(\tau (B)\)\(\tau\) 由4个并行的S盒构成。

3.3. 反序变换 \(R\)

4. 解密算法

本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。

解密时,使用轮密钥序 \(rk_{31}, rk_{30}, \cdots, rk_0\)

5. 小结

先将128比特密钥 \(MK\) 扩展为32个轮密钥 \(rk\),再将该轮密钥与128比特明文 \(X\) 经过轮函数进行32次迭代后,选取最后四次迭代生成的结果 \(X_{32}, X_{33}, X_{34}, X_{35}\) 进行反序变换,该变换结果作为最终的密文 \(Y\) 输出。