基本概念

  • 明文分组、**、生成的密文长度都为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)
密码学03.5(SM4算法)

加密

循环以下步骤:
Xi+4 = F(Xi, Xi+1, Xi+2, Xi+3, rk) ,i = [0, 31]
最后生成的X32, X33, X34, X35再逆序排列生成密文。
密码学03.5(SM4算法)

**扩展运算

输入加***:MK = (MK0, MK1, MK2, MK3),
中间数据:Ki , i = 0 ~ 35,
输出轮秘钥:rki , i = 0 ~ 31,rki = Ki+4
使用常数FK,固定参数CK,
密码学03.5(SM4算法)
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个参数第三个字节。
密码学03.5(SM4算法)

  • **扩展算法 :
    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)

相关文章: