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