SM4分組密碼算法


1. SM4算法定義

SM4密碼算法是我國自主設計的分組對稱密碼算法,用於實現數據的加密/解密運算,以保證數據和信息的機密性。

  1. 該算法的分組長度為128比特,密鑰長度為128比特。(十六進制表示則為32位,明文和密鑰等長)

  2. 加密算法與密鑰擴展算法都采用32輪非線性迭代結構。

  3. 密鑰擴展算法:將加密密鑰變換為輪密鑰的運算單元。

  4. 數據解密和數據加密的算法結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。

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





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM