看了这么多篇(骗)文章,感觉SM都没有意思了。

一、引言(其实我是不想写这个的)

作为我介绍的最后一个SM系列(手动SM),还是把这个写完在躺尸。

在前面介绍了SM2与SM3,二者分别为非对称秘钥演算法与摘要演算法,而我们知道,在这之前的种子选手是对称秘钥演算法(即不存在公私钥的概念,加解密使用的秘钥相同),而国家在2012年正式公开并批准了6项密码行业标准公告,其中涵盖SM2、SM3以及我们即将提到的SM4。

SM4官方阅读文档链接:pan.baidu.com/s/107JZO5 密码:4x16。

接下来进入专业模式:

二、简介

(1)分组密码复习

对称密码体制使用相同的加密密钥和解密密钥,其安全性主要依赖于密钥的保密性。分组密码是对称密码体制的重要组成部分,其基本原理为:将明文消息编码后的序列m0,m1,m2,…,mi划分为长度为L(通常为64或128)位的组m=(m0,m1,m2,…,mL-1),每组分别在密钥k=(k0,k1,k2,…,kt-1)(密钥长度为t)的控制下变换成等长的一组密文输出序列c=(c0,c1,c2,…,cL-1)。分组密码的模型如图所示:

分组密码实际上是在密钥的控制下,从一个足够大和足够好的置换子集中简单而迅速地选出一个置换,用来对当前输入的明文分组进行加密变换。现在所使用的对称分组加密演算法大多数都是基于Feistel分组密码结构的,遵从的基本指导原则是Shannon提出的扩散和混乱,扩散和混乱是分组密码的最本质操作。

分组密码与流密码的对比:分组密码以一定大小的分组作为每次处理的基本单元,而流密码则以一个元素(如一个字母或一个比特)作为基本的处理单元;流密码使用一个随时间变化的加密变换,具有转换速度快、低错误传播的优点,软硬体实现简单,缺点是低扩散、插入及修改不敏感;分组密码使用的是一个不对时间变化的固定变换,具有扩散性好、插入敏感等优点,缺点是加解密处理速度慢、存在错误传播。

(2)分组密码常用的五种模式

1.电码本模式(Electronic Codebook Book (ECB));

2.密码分组链接模式(Cipher Block Chaining (CBC));

3.计算器模式(Counter (CTR));

4.密码反馈模式(Cipher FeedBack (CFB));

5.输出反馈模式(Output FeedBack (OFB));

详细度娘,这不不再赘述。

(3)SM4

SMS4也称为SM4,是我国官方公布的第一个商用密码演算法,主要应用于无线区域网产品。SMS4演算法是一个分组演算法,其分组长度为128比特,密钥长度为128比特;加密演算法与密钥扩展演算法都采用32轮非线性迭代结构;解密演算法与加密演算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。密钥与明密文均以32比特为单位进行划分,轮函数与密钥扩展演算法也以32比特为基本单位进行运算。

三、演算法分析(其实前面的可不看)

(1)流程图

SM44也没有放流程图出来,你说我们国家就公开演算法,你不公开代码我都能理解,图好歹给一个吧(小声BB别举报)

放下刀,放下刀,我懂= =

交货了,甲方爸爸们:

(2)SMS4轮函数F

设输入X=(X0,X1,X2,X3),轮密钥为rk(由加密密钥通过密钥扩展演算法得到),则SMS4演算法的轮函数可表示为:

??(??0, ??2 ,??3 ,??4 ,????) = ??0???(??2???3???4?????)

L为线性变换,设输入为A,输出为B,则:

 B=L(A)=A (A<<<2) (A<<<10) (A<<<18) (A<<<24)

其中<<<i表示32比特循环左移i位,A、B均为为32 比特。

τ为非线性变换,以8比特为基本单位进行运算,由四个S盒组成。设输入A=(a0,a1,a2,a3),输出为B=(b0,b1,b2,b3),则:

B=(b0,b1,b2,b3)=τ(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))

其中ai、bi均为一个位元组,官方所给的S盒解构如下:

(3)SMS4扩展密钥演算法

SMS4的扩展密钥演算法用来通过输入的加密密钥生成32个轮密钥,演算法描述如下:

加密密钥MK=(MK0, MK1, MK2, MK3),i=0,1,2,3;中间变数为Ki,i=0,1,…,35;轮密钥为rki,i=0,1,…,31;其中MKi、Ki、rki均为32比特;则密钥生成方法为:

其中:

系统参数FK的取值用16进位来表示:

FK0=(A3B1BAC6)

FK1=(56AA3350)

FK2=(677D9197)

FK3=(B27022DC)

L』为L的修改,公式如下:

固定参数CK的取值方法为:设cki,j为CKi的第j位元组(i=0,1,…,31,j=0,1,2,3),即CKi = (cki,0,cki,1,cki,2,cki,3),则cki,j = (4i+j)×7(mod 256);32个固定参数CKi,其16进位表示为:

00070e15, 1c232a31, 383f464d, 545b6269,
70777e85, 8c939aa1, a8afb6bd, c4cbd2d9,
e0e7eef5, fc030a11, 181f262d, 343b4249,
50575e65, 6c737a81, 888f969d, a4abb2b9,
c0c7ced5, dce3eaf1, f8ff060d, 141b2229,
30373e45, 4c535a61, 686f767d, 848b9299,
a0a7aeb5, bcc3cad1, d8dfe6ed, f4fb0209,
10171e25, 2c333a41, 484f565d, 646b7279。

(4)SMS4加密演算法

设明文输入为(M0,M1,M2,M3),密文输出为(C0,C1,C2,C3),轮密钥为rki,i=0,1,2,…,31,其中,Mi、Ci、rki均为32比特;则SMS4演算法的加密过程包括迭代和反序变换。

1、32 次迭代运算

2、反序变换

(5)SMS4解密演算法

SMS4演算法的解密与加密变换结构相同,但轮密钥使用顺序相反。解密时,使用 轮密钥序(????31,????30,?,????0)。

四、演算法的C实现

(1)结果展示

(2)核心代码(高能模式)

最简单的ECB模式:

void sm4_crypt_ecb(sm4_context *ctx,
int flag,
int length,
unsigned char *input,
unsigned char *output) {
while (length > 0) {
sm4_one_round(ctx->sk, input, output);
input += 16;
output += 16;
length -= 16;
}
}

(3)源码

我知道你们也不想看,诺,这里有完整的可运行代码和说明文件,拿去用吧。链接:pan.baidu.com/s/1pBFg8d 密码:hyx7

五、小结

(1)对称密码还是挺好用的,一般使用的时候都是对称、非对称、摘要演算法一顿组合拳,威力极大。

(2)有钱好办事。

(3)有刀也可以。

SM系列完结撒花,以上,接下来会写ZUC以及一些古典密码。


推荐阅读:
查看原文 >>
相关文章