下图是SM4的加密流程图以及SM4轮函数的示意图。
在SM4加密的过程中经过了32轮轮函数F。
X0,X1 ,X2 ,X3为128bit的输入
轮函数F(Xi,Xi+1 ,Xi+2 ,Xi+3) = Xi ⊕T(Xi+1 ⊕Xi+2 ⊕Xi+3⊕rki) 。轮函数F如上图所示
经过轮函数F之后会产生一个字的结果,执行32轮迭代之后会产生36个字(X0,X1 ,…,X32,X33,X34,X35)
T是一个可逆变换,由非线性变换τ和线性变换L复合而成。
T(A)=L(τ(A))
S盒中的数据采用的是十六进制来表示。四个S盒一共为32bit,每个S盒为8bit。
如S盒的输入如果是EF则输出结果是第E行第F列的值。
eg:输入:A = a0,a1 ,a2 ,a3;输出B=b0,b1 ,b2 ,b3
则(b0,b1 ,b2 ,b3)=τ(A)=(Sbox( a0),Sbox( a1),Sbox( a2),Sbox( a3))
(其中A为合成置换中的输入A:A=Xi+1 ⊕Xi+2 ⊕Xi+3⊕rki)
c=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24)
其中B是32位的数,输出仍是32位
输入B的值为非线性变换τ输出的32的值
B<<
eg:B=123456。则 B<<<3 = 456123
32轮迭代后在最后会加上反序变换。
反序变换R:R(a0,a1 ,a2 ,a3)=(a3,a2 ,a1 ,a0)
密文为(Y0,Y1 ,Y2 ,Y3) =R(X32,X33 ,X34 ,X35)=(X35,X34 ,X33 ,X32)