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))$ 。
非线性变换 $\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 所示:
图 1 S 盒
线性变换 $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 轮子密钥:
其中:
$T^{\prime} = L^{\prime}(\tau(\cdot))$ ,$L^{\prime}$ 表示为:
$FK$ 是系统参数,取值为:
$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 分组密码算法