基本概念
- 明文分组、密钥、生成的密文长度都为128位。
- 采用非对称的Feistal结构。迭代32轮
- 对合运算,加解密算法一样。
SM4算法
基本变换规则
- 非线性变换τ
输入为32位,一共使用四个S盒,每个S盒处理8位,起混淆作用,设输入为A(a0~a3)输出为B则有:
B = τ(A) = S_box(a0), S_box(a1), S_box(a2), S_box(a3) - 线性变换L
输入为32位,起扩散作用,设输入为B输出为C则有:
C = L(B) = B ⊕ (B << 2) ⊕ (B << 10) ⊕ (B << 18) ⊕ (B << 24) - 合成变换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)