# SM4算法设计原理
# SM4分组密码算法描述:
SM4分组密码算法是一个迭代分组密码算法,由加解密算法和密钥扩展算法组成。SM4分组密码算法采用非平衡Feistel结构,分组长度为128b密钥长度为128b。加密算法与密钥扩展算法均采用非线性迭代结构。加密运算和解密运算的算法结构相同,解密运算的轮密钥的使用顺序与加密运算相反。
# 密钥及密钥参量:
SM4分组密码算法的加密密钥长度为128b,表示为MK=(MK0,MK1,MK2,MK3),其中MKi(i=1,2,3)为32b。
轮密钥表示为(rk0,rk1,···,rk31),其中rki(i=0,1,···,31)为32b。轮密钥由加密密钥生成。
FK=(FK1,FK2,FK3,FK4)为系统参数,CK=(CK0,CK1,···,CK31)为固定参数,用于密钥扩展算法,其中FKi(i=0,1,···,3),CKi(i=0,1,···,31)均为32b。
# 加密算法
SM4加密算法由32次迭代运算和1次反序变换R组成
设明文输入为(X0,X1,X2,X3)∈(Z232)4,密文输出为(Y0,Y1,Y2,Y3)∈(Z232)4,轮密钥为rki∈Z232,i=0,1,···,31。加密算法的运算过程如下。
(1)首先执行32次迭代运算:
Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=Xi XOR T(Xi XOR Xi+1 XOR Xi+2 XOR Xi+3 XOR rki),i=0,1,···31
(2)对最后一轮数据进行反序变换并得到密文输出:
(Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32)。
其中,T:Z232→Z232一个可逆变换,由非线性变换τ和线性变换L复合而成,即T(·)=L(τ(·))。
非线性变换τ由4个并行的S盒构成。设输入为A=(a0,a1,a2,a3)∈(Z28)4,非线性变换τ的输出为B=(b0,b1,b2,b3)∈(Z28)4,即:
(b0,b1,b2,b3)=τ(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))。
设S盒的输入为EF,则经S盒运算的输出结果结果为第E行、第F列的值,即Sbox(EF)=0x84。
L是线性变换,非线性变换τ的输出是线性变换L的输入。设输入为B∈Z232,则:
C=L(B)=B XOR (B<<<2) XOR (B<<<10) XOR (B<<<18) XOR (B<<<24)。
# 解密算法:
本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序,解密时使用轮密钥序(rk31,rk30,···,rk0)。
# 密钥扩展算法:
本算法轮密钥由加密密钥通过密钥扩展算法生成。设加密密钥为MK,MK=(MK0,MK1,MK2,MK3)∈(Z232)4。
轮密钥生成方法为rki=Ki XOR T’(Ki+1 XOR Ki+2 XOR Ki+3 XOR CKi),(i=0,1,2,···,31),其中:
K0=MK0 XOR FK0;
K1=MK1 XOR FK1;
K2=MK2 XOR FK2;
K3=MK3 XOR FK3。
(1)T’是将3.2.2节中合成置换T的线性变换L替换为L’:
L’(B)=BXOR (B<<<13)XOR (B<<<23)。
(2)系统参数FK的取值为
FK0=(A2B1BAC6);
FK1=(56AA3350);
FK2=(677D9197);
FK3=(B27022DC)。
(3)固定参数CK取值方法为:
设cki,j为CKi的第j字节(i=0,1,···,31;j=0,1,2,3),即CKi=(cki,0,cki,1,cki,2,cki,3)∈(Z28)4,则cki,j=(4i+j)×7(mod 256)。
固定参数CKi(i=0,1,2,···,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。