1. SM4算法定义
SM4密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。
-
该算法的分组长度为128比特,密钥长度为128比特。(十六进制表示则为32位,明文和密钥等长)
-
加密算法与密钥扩展算法都采用32轮非线性迭代结构。
-
密钥扩展算法:将加密密钥变换为轮密钥的运算单元。
-
数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
2. SM4算法的优势
国密算法SM4有安全高效的特点,在设计与实现方面有以下优势:
- 对合运算:解密算法与加密算法相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
- 子密钥生成算法与加密算法结构类似,在设计上做到资源重用。
- 加密算法与密钥扩展算法都采用32轮非线性迭代结构,将128位的明文、密钥通过32次循环的非线性迭代运算得到最终结果。
3. 加密算法流程
整体流程框架:
或者参考
北卡科技的博客中的流程图:
SM4算法结构:
轮密钥生成:
32次非线性迭代:
3.1. 密钥扩展算法
密钥扩展算法:将加密密钥变换为轮密钥的运算单元。
轮密钥 (rk_i) 生成方法:
(rk_i=K_{i+4}=K_ioplus T'(K_{i+1}oplus K_{i+2}oplus K_{i+3}oplus CK_{i}), i=0,1,cdots,31)。
合成置换 (T':Z_2^{32} ightarrow Z_2^{32}) 是一个可逆变换,由非线性变换 ( au) 和线性变换 (L')复合而成,即 (T'(cdot)=L'( au(cdot)))。
线性变换 (L'): (L'(B)=B oplus (B <<< 13)oplus (B<<<23)),其中 (<<< i) 表示32位循环左移 (i) 位。
非线性变换 ( au): ( au (B)),( au) 由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) imes 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 |
非线性变换 ( au)
例如输入为 (01 23 45 67),则该 ( au) 变换应为:(90 F4 73 A2)。((01 ightarrow 第0行第1列 ightarrow 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} ightarrow Z_2^{32}) 是一个可逆变换,由非线性变换 ( au) 和线性变换 (L)复合而成,即 (T(cdot)=L( au(cdot)))。
线性变换 (L): (L(B)=B oplus (B <<< 2)oplus (B<<<10)oplus (B<<<18)oplus (B<<<24))。
非线性变换 ( au): ( au (B)),( au) 由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) 输出。