路漫 2020-04-30
分组加密算法:明文和密文分组长度128比特
结构:广义 Feistel结构,基本操作单位32比特
SMS4加/解密算法
加密算法:
首先,将128比特 明文 分为4个32比特字(Z232中元素),分别赋值给四个寄存器A,B,C,D(D为最高)
进行32轮F运算,设每轮输入为寄存器当前状态值(D,C,B,A)∈(Z232)和轮密钥为rki∈Z232,则轮函数F为:
F(D,C,B,A,rki)=A⊕T(B⊕C⊕D⊕rki)
将寄存器最右边字A的值移出,高三个字顺次右移32位,F函数的输出赋值给最左边的寄存器字D。
32轮的输出(X35X34X33X32)进行反序变换R然后输出密文。
R(X35X34X33X32)=(X32X33X34X35)
轮迭代
广义Feistel结构
轮函数F
输入寄存器值(Xi+3,Xi+2,Xi+1,Xi) rki和轮密钥:
Xi+4=F(Xi+3,Xi+2,Xi+1,Xi;rki)=X⊕T(Xi+3⊕Xi+2⊕Xi+1⊕Xi⊕rki)
Z232->Z232 i=0,1,..31
合成置换T
T:是一个可逆变换,由非线性变换τ和线性变换L复合而成,即T(.)=L(τ(.))
非线性变换τ由4个并行的S盒构成,设输入Y=(y3,y2,y1,y0)∈(Z28)4,输出z=z(z3,z2,z1,z0)∈(Z28)4
则(z3,z2,z1,z0)∈τ(Y)=(Sbox(y3),Sbox(y2),Sbox(y1)Sbox(y0))
线性变化L
设输入为Z232,输出为W∈Z232,则
W=L(Y)=Y⊕(Y<<<2)⊕(Y<<<10)⊕(Y<<<18)⊕(Y<<<24)
S盒:
SMS4秘钥编排算法
输入:
1)加密密钥MK长度为128bit,MK=(MK0,MK1,MK2,MK3),其中MKi(i=0,1,2,3)为字;
2)FK=(FK0,FK1,FK2,FK3)为系统参数,CK=(CK0,CK1,CK2,...CK31)为固定参数,用于密钥扩展算法,其中FKi(i=0,1,2,3),CKi(i=0,1,...31)均为字
输出:
轮密钥表示为(rk0,rk1,...rk31),其中rki(i=0,1,...31)均为字
说明:系统参数FK的取值,采用16进制表示为:FK0=(A3B1BAC6) FK1=(56AA3350) FK2=(677D9197) FK3=(B27022DC)
固定参数CKi的取值方法:设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+7j)(mod256)
32个固定参数CKi,其16进制表示为:
密钥扩展方法:
加密密钥MK=(MK0,MK1,MK2,MK3),MKi∈Z232(i=0,1,2,3)
轮密钥为rki∈Z232,i=0,1,2,...,31 其生成方法为:
1)(K0,K1,K2,K3)=(MK0⊕FK0,MK1⊕FK1,MK2⊕FK2,MK3⊕FK3)
2)对i=0,1,2,...,31 循环的做rki=Ki+4=Ki⊕T‘(Ki+1⊕Ki+2⊕Ki+3⊕CKi)
说明:T‘变换与加密算法轮函数中的T基本相同,只将其中的线性变换L修改为:L‘(Y)=Y⊕(<<<13)⊕(Y<<<23)
本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。
加密时:(rk0,rk1,...,rk31)
解密时:(rk31,...,rk1,rk0)