密碼學03.5(SM4算法)

基本概念

  • 明文分組、密鑰、生成的密文長度都爲128位。
  • 採用非對稱的Feistal結構。迭代32輪
  • 對合運算,加解密算法一樣。

SM4算法

基本變換規則
  1. 非線性變換τ
    輸入爲32位,一共使用四個S盒,每個S盒處理8位,起混淆作用,設輸入爲A(a0~a3)輸出爲B則有:
    B = τ(A) = S_box(a0), S_box(a1), S_box(a2), S_box(a3)
  2. 線性變換L
    輸入爲32位,起擴散作用,設輸入爲B輸出爲C則有:
    C = L(B) = B ⊕ (B << 2) ⊕ (B << 10) ⊕ (B << 18) ⊕ (B << 24)
  3. 合成變換T
    是前兩步的複合:T(X) = L(τ(X))
輪函數F

輸入數據(X0, X1, X2, X3),共128位,每個X是32位。
輸入輪祕鑰:rk, 32位。
輸出數據:32位。
輪函數:F(X0, X1, X2, X3, rk) = X0 ⊕ T(X1 ⊕ X2 ⊕ X3 ⊕ rk)
在這裏插入圖片描述

加密

循環以下步驟:
Xi+4 = F(Xi, Xi+1, Xi+2, Xi+3, rk) ,i = [0, 31]
最後生成的X32, X33, X34, X35再逆序排列生成密文。
在這裏插入圖片描述

密鑰擴展運算

輸入加密密鑰:MK = (MK0, MK1, MK2, MK3),
中間數據:Ki , i = 0 ~ 35,
輸出輪祕鑰:rki , i = 0 ~ 31,rki = Ki+4
使用常數FK,固定參數CK,
在這裏插入圖片描述
CKij = (4i + j) * 7 (mod256), i=0,1,2…31, j=0,1,2…3 中,i表示第i個參數,j表示這個參數裏第j個字節
比如:「00070e15」中,「00」表示第0個參數第0個字節,「15」表示第0個參數第三個字節。
在這裏插入圖片描述

  • 密鑰擴展算法 :
    128位密鑰生成32個32位的子密鑰。
    MK = (MK0,MK1, MK2, MK3 )
    ①(K0, K1, K2, K3)= (MK0 ⊕ FK0, MK1⊕ FK1, MK2⊕ FK2, MK3⊕ FK3 )
    ② rki = Ki+4 = Ki ⊕ T( Ki+1 ⊕ Ki+2 ⊕ Ki+3 ⊕ CKi), 其中這裏的線性變換L稍有不同: L(B)= B ⊕ (B << 13) ⊕ (B << 23)