SM4密码算法学习笔记

68 阅读2分钟

在这里插入图片描述 SM4密码算法是一个分组密码算法。该算法的分组长度是128比特,密钥长度是128比特。加密算法于密钥扩展算法均采用非线性迭代结构,运算轮数均为32轮。数据解密和加密的算法结构相同,知识解密轮密钥是加密轮密钥的逆序。

轮函数FF

轮函数结构

设输入为(X0,X1,X2,X3)(Z232)4(X_0,X_1,X_2,X_3) \in (Z_2^{32})^4,轮密钥为rkZ232rk \in Z_2^{32},则轮函数为:

F(X0,X1,X2,X3)=X0T(X1X2X3rk)F(X_0,X_1,X_2,X_3)=X_0 \bigoplus T(X_1 \bigoplus X_2 \bigoplus X_3 \bigoplus rk)

合成置换TT

T:Z232Z232T:Z_2^{32} \rightarrow Z_2^{32}是一个可逆变换,由非线性变换τ\tau和线性变换LL复合而成,即T(.)=L(τ(.))T(.)=L(\tau(.))

  1. 非线性变换τ\tau由4个并行的S盒构成,设输入为A=(a0,a1,a2,a3,)(Z28)4A=(a_0,a_1,a_2,a_3,) \in (Z_2^{8})^4,输出为B=(b0,b1,b2,b3)(Z28)4B=(b_0,b_1,b_2,b_3) \in (Z_2^{8})^4,如式:(b0,b1,b2,b3)=τ(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))(b_0,b_1,b_2,b_3)=\tau(A)=(Sbox(a_0),Sbox(a_1),Sbox(a_2),Sbox(a_3))SboxSbox的数据见表: 在这里插入图片描述 在这里插入图片描述

  2. 线性变换LL。非线性变换τ\tau的输出是线性变换LL的输入。设输入为B(Z232)4B \in (Z_2^{32})^4,输出为C(Z232)4C \in (Z_2^{32})^4,则如式C=L(B)=B(B<<<2)(B<<<10)(B<<<18)(B<<<24)C =L(B)=B\bigoplus(B<<<2)\bigoplus(B<<<10)\bigoplus(B<<<18)\bigoplus(B<<<24)

一、加密算法

加密算法由32次迭代运算和一次反序变换组成。 设明文输入为(X0,X1,X2,X3)(Z232)4(X_0,X_1,X_2,X_3) \in (Z_2^{32})^4,密文输出为(Y0,Y1,Y2,Y3)(Z232)4(Y_0,Y_1,Y_2,Y_3) \in (Z_2^{32})^4,轮密钥为rki(Z232)4,i=0,1,2,...,31rk_i \in (Z_2^{32})^4,i=0,1,2,...,31。加密算法的运算过程如下:

1. 迭代运算

32次迭代运算见式:

Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)i=0,1,2,...,31X_{i+4}=F(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i),i=0,1,2,...,31

2.反序变换

反序变换见式:

(Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32)(Y_0,Y_1,Y_2,Y_3)=R(X_{32},X_{33},X_{34},X_{35})=(X_{35},X_{34},X_{33},X_{32})

二、解密算法

本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。解密时,使用轮密钥序(rk31,rk30,...rk0)(rk_{31},rk_{30},...rk_{0})

三、密钥扩展算法

加密过程使用的轮密钥由加密密钥生成,其中加密密钥MK=(MK0,MK1,MK2,MK3)(Z232)4MK=(MK_0,MK_1,MK_2,MK_3) \in (Z_2^{32})^4,加密过程中的轮密钥生成方法如下式:

(K0,K1,K2,K3)=(MK0FK0,MK1FK1,MK2FK2,MK3FK3)(K_0,K_1,K_2,K_3)=(MK_0 \bigoplus FK_0,MK_1 \bigoplus FK_1,MK_2 \bigoplus FK_2,MK_3 \bigoplus FK_3)

rki=Ki+4=KiT(Ki+1Ki+2Ki+3CKi)i=0,1,2,...,31rk_i=K_{i+4}=K_i \bigoplus T^ \prime (K_{i+1} \bigoplus K_{i+2} \bigoplus K_{i+3} \bigoplus CK_i),i=0,1,2,...,31

式中:

  1. TT^ \prime是将合成置换 TT的线性变换LL替换为LL^ \prime,见式:L(B)=B(B<<<13)(B<<<23)L^ \prime (B)=B\bigoplus (B<<<13)\bigoplus (B<<<23)
  2. 系统参数FKFK的取值为:FK0=(A3B1BAC6)FK1=(56AA3350)FK2=(677D9197)FK3=(B27022DC)FK_0=(A3B1BAC6),FK_1=(56AA3350),FK_2=(677D9197),FK_3=(B27022DC)
  3. 固定参数CKCK的取值方法为:设cki,jck_{i,j}CKiCK_{i}的第jj字节(i=0,1,...,31;j=0,1,2,3)(i=0,1,...,31;j=0,1,2,3),即CKi=(cki,0,cki,1cki,2cki,3)(Z28)4CK_i=(ck_{i,0},ck_{i,1}ck_{i,2}ck_{i,3}) \in (Z_2^{8})^4,则cki,j=(4i+j)×7(mod256)ck_{i,j}=(4i+j) \times 7(mod 256)。固定参数CKi((i=0,1,...,31)CK_i((i=0,1,...,31)具体值为: 在这里插入图片描述 解密密钥同加密密钥,解密使用的轮密钥由解密密钥生成,其轮密钥生成方法同加密过程的轮密钥生成方法。