SM4

概述

SM4是一种分组密码,由我国国家密码管理局在2012年发布,常用于无线互联网加密等领域.

SM4是分组密码,分组长度为128bit(即16byte,4word),密钥长度也为128bit(即16byte,4word).

加解密过程经过32轮迭代(类似DES,AES),每一轮也都需要一个轮密钥.

加密过程

加密过程由32轮迭代和1次反序变换组成.

32轮迭代

解释:

  1. 对4字(16byte)明文进行32轮迭代,每轮迭代都需要一个字(4byte)的轮密钥,即共需要32个轮密钥,记为(rk0,rk1,rk2,……,rk31),因此需要进行密钥扩展.

  2. 迭代即使用轮函数F不断向后计算下一个字.SM4的轮函数F接受4个1字数据和一个1字轮密钥,最终生成一个字的结果.

第一轮迭代即使用前4字(X0-X3)计算第5个字X4;第二轮迭代即使用(X1-X4)计算第6个字X5;以此类推,最终生成36个字的结果,完成第一步,过程如下:

\[X_{4+i}=F(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i)\ (i\in[0,31]) \]

一次反序变换

第二步为一次简单的反序变换,将最后生成的4字(X32,X33,X34,X35)进行反序,即得到最终的密文(Y0,Y1,Y2,Y3)=(X35,X34,X33,X32)

解密过程

解密过程与加密过程完全相同,也需要32次迭代和1次反序变换,只不过在迭代时要将,轮密钥逆序使用.

密钥扩展和轮函数F

密钥扩展

SM4的原始密钥为128位(4字),根据原始密钥扩展为32个1字子密钥.

与系统参数异或-初始化密钥

将原始密钥的每个字\(MK_i\)与系统参数\(FK_i\)异或,得到4个新字\((K_0,K_1,K_2,K_3)\),即:

\[(K_0,K_1,K_2,K_3) = (MK_0 \oplus FK_0,MK_1 \oplus FK_1,MK_2 \oplus FK_2,MK_3 \oplus FK_3) \]

FK为: 0xA3B1BAC6,0x56AA3350,0x677D9197,0xB27022DC

轮迭代生成轮密钥

根据\((K_0,K_1,K_2,K_3)\)进行32轮迭代,生成32个轮密钥.公式如下:

\[rk_i = K_{i+4} = K_i \oplus T^{'}(K_{i+1} \oplus K_{i+2} \oplus K_{i+3} \oplus CK _i)\ (i = 0,1,2,...,31) \]

置换\(T^{'}\)

该置换与加密过程的合成置换\(T\)完全类似,其中非线性变换\(\tau\)完全相同,线性变换\(L^{'}\)略有不同:

\[L^{'}(B) = B \oplus (B<<<13) \oplus (B<<<23) \]

32个固定参数CK为(后缀h代表16进制数):

image-20240115125211392

轮函数F

F函数定义

\[F(X_i,X_{i+1},X_{i+2},X_{i+3},rk_i) = X_i \oplus T(X_{i+1} \oplus X_{i+2} \oplus X_{i+3} \oplus rk_i) \]

其中T()为合成置换.

合成置换T

合成置换T接受1字的输入A,得到1字的输出C.包含非线性变换\(\tau\)和线性变换\(L\)两部分.

非线性变换\(\tau\)

非线性变换即对入参A(1字/4byte)进行S盒变换,输出结果B(1字/4byte).S盒如下:

image-20240115121103438

对于输入的每个字节,使用其16进制表示,高位(即二进制高4位)作为行坐标,低位(即二进制低4位)作为列坐标,替换为S盒中对应值.

线性变换\(L\)

线性变换\(L\)使用循环左移(使用<<<符号代表)和异或,公式如下:

\[C = L(B) = B \oplus (B<<<2) \oplus (B<<<10) \oplus (B<<<18) \oplus B(<<<24) \]

经过非线性变换\(\tau\)和线性变换\(L\),即完成一次合成置换T.

posted @ 2024-01-24 17:53  WA-HAHA  阅读(276)  评论(0)    收藏  举报