最近国密SM4加密挺火的,毕竟是中国国家密码局认定的国产密码算法,在逆向加密中出现的比较多。

SM4原理

国密SM4官方文档,个人认为官方文档挺好理解的。还有就是一个人截图的浙大diffie教授的课件图片个人觉得里面的图片也很好理解,毕竟国内的资料里面基本没有很好理解的图(悄咪咪搜了一下diffie教授瞬间羡慕好学校的学生们)

加密

SM4加密分为三个过程:轮密钥的准备,32次迭代运算,后四位反序得结果

32次迭代运算

图上是32次迭代运算的公式,其中x为输入的值(32bit),F()是轮函数,rk[i]是轮密钥(32bit)。轮函数的表达式是:

即X1与x2与x3与轮密钥rk[i]异或后的值经过合成置换T函数再与x0异或。
合成置换T,由非线性变换τ先行变换L复合而成:

1.非线性变换τ

非线性变化τ主要操作是把输入的A(8bit)分成四份分别对应到s盒(已知矩阵)中

2.线性变换L

非线性变换的输出即为线性变换的输入,过程为:

反序变换

看到这里是不是已经忘记32次迭代运算是什么了…..我们来回顾一下32次迭代运算,以上经过合成置换得到的值要与输入的第一个值x0异或得到的值即为x4的值,经过上面32次轮函数的循环,就能得到新的x0(32bit)到x32的值,最后将最后四个值经过反序变换

输出即为加密过后的值

轮密钥的准备

轮密钥的准备放在后面讲是因为轮密钥也使用了合成置换,但是这个合成置换与前面的轮函数中的合成置换有一点区别。
轮密钥生成方法:

输入加密密钥MK(128bit)分成四份MK0(32bit),MK1,MK2.MK3分别与系统参数(已知)FK0,FK1,FK2,FK3异或,下面一个公式我们可以得到两个重要步骤。其中CK[i]为固定参数。

第一步:是类似于32迭代运算的公式得到ki+4

第二步:是我们得到的这个k[i+4]赋值给了rki

T′ 是将32次迭代运算中合成置换T的线性变换L替换为L′:

系统参数FK的取值:

固定参数CK具体值为:

解密

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

实现脚本

正在修缮中…