0%

SM4 分组密码算法简介

SM4 算法是我国商用分组密码算法,被广泛用于无线网络数据加密传输中。SM4 算法的密钥长度和分组长度均为 128 比特,解密算法是加密算法的逆运算,只需将轮密钥逆序输入即可得到明文。SM4 与 AES 算法的比较如表 1 所示。

表 1 SM4 与 AES 算法比较

算法 加密轮数 密钥长度(比特) 分组长度(比特)
SM4 32 128 128
AES-128 10 128 128
AES-192 12 192 128
AES-256 14 256 128

SM4 加密算法

为了方便说明,本文定义 $Z_2^m$ 表示 $m$ 比特向量,符号 $\oplus$ 表示异或运算。设明文输入为 $X = \left(X_0,X_1,X_2,X_3\right) \in \left(Z_2^{32}\right)^4$ ,密文输出为 $Y = \left(Y_0,Y_1,Y_2,Y_3\right) \in \left(Z_2^{32}\right)^4$ ,轮密钥为 $rk_i \in Z_2^{32}, i=0,1,\dots,31$ ,则 SM4 加密算法表示为:

其中,$T$ 是一个 $Z_2^{32} \to Z_2^{32}$ 的合成变换,包含线性变换 $L$ 和 非线性变换 $\tau$ ,即:$T(x) = L(\tau(x))$ 。

  1. 非线性变换 $\tau$ 由 4 个并行的 8 进 8 出的 S 盒查表组成,设输入为 $x=(x_0,x_1,x_2,x_3) \in (Z_2^8)^4$ ,输出为 $y=(y_0,y_1,y_2,y_3) \in (Z_2^8)^4$ ,则:

    对于 S 盒的 8 位输入,将前 4 位作为行,后 4 位作为列,输出即为查找表中对应行列所对应的 值。S 盒如图 1 所示:

    image-20210905154433201

    图 1 S 盒

  2. 线性变换 $L$ 接收非线性变换 $\tau$ 的输出作为输入,设线性变换 $L$ 的输出为 $z \in Z_2^{32}$ ,则:

    其中,$\lll$ 表示循环左移,如 $y \lll 2$ 表示将 $y$ 循环左移 2 位。

SM4 密钥扩展算法

SM4 算法使用密钥扩展算法对初始密钥进行扩展生成各轮子密钥。令初始密钥表示为 $MK=(MK_0,MK_1,MK_2,MK_3) \in (Z_2^{32})^4$ ,则按如下方式生成 32 轮子密钥:

其中:

  1. $T^{\prime} = L^{\prime}(\tau(\cdot))$ ,$L^{\prime}$ 表示为:

  2. $FK$ 是系统参数,取值为:

  3. $CK$ 是固定参数,其构造方法为:

    设 $CK_{i}$ 的第 $j$ 个字节为 $ck_{i,j} i=0,1,\dots,31; j=0,1,2,3$ ,即 $CK_i = (ck_{i,0}, ck_{i,1}, ck_{i,2}, ck_{i,3}) \in (Z_2^8)^4$ ,那么有:

    根据此计算方法,可以计算出所有的 $CK$ 值,即:

    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

参考文献

[1] SM4 分组密码算法