目录

  • 1. SM4算法定义
  • 2. SM4算法的优势
  • 3. 加密算法流程
  • 3.1. 密钥扩展算法
  • 非线性变换 \(\tau\)
  • 3.2. 轮函数 \(F\)
  • 3.3. 反序变换 \(R\)
  • 4. 解密算法
  • 5. 小结

1. SM4算法定义

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

  1. 该算法的分组长度为128比特,密钥长度为128比特。(十六进制表示则为32位,明文和密钥等长)
  2. 加密算法与密钥扩展算法都采用32轮非线性迭代结构。
  3. 密钥扩展算法:将加密密钥变换为轮密钥的运算单元。
  4. 数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

2. SM4算法的优势

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

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

3. 加密算法流程

整体流程框架:

代码实现DES轮密钥扩展算法python 轮密钥长度_线性变换

或者参考

北卡科技的博客中的流程图

SM4算法结构:

代码实现DES轮密钥扩展算法python 轮密钥长度_线性变换_02

轮密钥生成:

代码实现DES轮密钥扩展算法python 轮密钥长度_加密算法_03

32次非线性迭代:

代码实现DES轮密钥扩展算法python 轮密钥长度_迭代_04

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\)。

代码实现DES轮密钥扩展算法python 轮密钥长度_迭代_05

合成置换 \(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\)

代码实现DES轮密钥扩展算法python 轮密钥长度_迭代_06

代码实现DES轮密钥扩展算法python 轮密钥长度_加密算法_07

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

3.2. 轮函数 \(F\)

轮函数 \(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 \)

代码实现DES轮密钥扩展算法python 轮密钥长度_线性变换_08

合成置换 \(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\)

代码实现DES轮密钥扩展算法python 轮密钥长度_迭代_09

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\)