无线局域网密码算法(SM4)

分组加密算法:明文和密文分组长度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)∈(Z284,输出z=z(z3,z2,z1,z0)∈(Z284

则(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)∈(Z284     则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

猜你喜欢

转载自www.cnblogs.com/sjyu/p/12744172.html