SM4密码算法是一个分组密码算法。该算法的分组长度是128比特,密钥长度是128比特。加密算法于密钥扩展算法均采用非线性迭代结构,运算轮数均为32轮。数据解密和加密的算法结构相同,知识解密轮密钥是加密轮密钥的逆序。
轮函数F
轮函数结构
设输入为(X0,X1,X2,X3)∈(Z232)4,轮密钥为rk∈Z232,则轮函数为:
F(X0,X1,X2,X3)=X0⨁T(X1⨁X2⨁X3⨁rk)
合成置换T
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)),Sbox的数据见表:

-
线性变换L。非线性变换τ的输出是线性变换L的输入。设输入为B∈(Z232)4,输出为C∈(Z232)4,则如式C=L(B)=B⨁(B<<<2)⨁(B<<<10)⨁(B<<<18)⨁(B<<<24)
一、加密算法
加密算法由32次迭代运算和一次反序变换组成。
设明文输入为(X0,X1,X2,X3)∈(Z232)4,密文输出为(Y0,Y1,Y2,Y3)∈(Z232)4,轮密钥为rki∈(Z232)4,i=0,1,2,...,31。加密算法的运算过程如下:
1. 迭代运算
32次迭代运算见式:
Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki),i=0,1,2,...,31
2.反序变换
反序变换见式:
(Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32)
二、解密算法
本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。解密时,使用轮密钥序(rk31,rk30,...rk0)。
三、密钥扩展算法
加密过程使用的轮密钥由加密密钥生成,其中加密密钥MK=(MK0,MK1,MK2,MK3)∈(Z232)4,加密过程中的轮密钥生成方法如下式:
(K0,K1,K2,K3)=(MK0⨁FK0,MK1⨁FK1,MK2⨁FK2,MK3⨁FK3)
rki=Ki+4=Ki⨁T′(Ki+1⨁Ki+2⨁Ki+3⨁CKi),i=0,1,2,...,31
式中:
- T′是将合成置换 T的线性变换L替换为L′,见式:L′(B)=B⨁(B<<<13)⨁(B<<<23)
- 系统参数FK的取值为:FK0=(A3B1BAC6),FK1=(56AA3350),FK2=(677D9197),FK3=(B27022DC)。
- 固定参数CK的取值方法为:设cki,j为CKi的第j字节(i=0,1,...,31;j=0,1,2,3),即CKi=(cki,0,cki,1cki,2cki,3)∈(Z28)4,则cki,j=(4i+j)×7(mod256)。固定参数CKi((i=0,1,...,31)具体值为:
解密密钥同加密密钥,解密使用的轮密钥由解密密钥生成,其轮密钥生成方法同加密过程的轮密钥生成方法。