SM4分组密码算法
2020-09-08 14:35 书书书书君 阅读(10006) 评论(3) 编辑 收藏 举报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_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\) 输出。