SM4分组密码算法

news/2024/12/28 13:27:59/

对称加密算法SM4

  • SM4算法介绍
  • 一、SM4加密流程
  • 二、轮函数F
    • 1.合成置换T
    • 3.非线性变换τ
    • 2.线性变换L
    • 4.加密的结果
  • 总结


SM4算法介绍

  • SM4.0于2013年3月被列为国家密码行业标准“GM/T 0002-2012《SM4分组密码算法》(原SMS4分组密码算法)”。2016年被列入国家标准(GB/T 32907-2016)
  • 在商用密码体系中,SM4主要用于数据加密,其算法公开,分组长度与密钥长度均为128bit。加密算法与密钥扩展算法都采用32轮非线性迭代结构,采用非平衡Feistel。每一轮需要一个轮密钥。以字(32bit)为单位加密。
  • M4算法加/解密算法的结构相同,只是使用轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。

一、SM4加密流程

下图是SM4的加密流程图以及SM4轮函数的示意图。
在SM4加密的过程中经过了32轮轮函数F。
在这里插入图片描述

二、轮函数F

X0,X1 ,X2 ,X3为128bit的输入
轮函数F(Xi,Xi+1 ,Xi+2 ,Xi+3) = Xi ⊕T(Xi+1 ⊕Xi+2 ⊕Xi+3⊕rki) 。轮函数F如上图所示
经过轮函数F之后会产生一个字的结果,执行32轮迭代之后会产生36个字(X0,X1 ,…,X32,X33,X34,X35)

1.合成置换T

T是一个可逆变换,由非线性变换τ和线性变换L复合而成。
T(A)=L(τ(A))

  • 非线性变换τ是由4个S盒组成的。
  • 非线性变换τ的输出是线性变换L的输入。
    其中输入A是32bit
    第i轮A的值为:A=Xi+1 ⊕Xi+2 ⊕Xi+3⊕rki

3.非线性变换τ

S盒中的数据采用的是十六进制来表示。四个S盒一共为32bit,每个S盒为8bit。
如S盒的输入如果是EF则输出结果是第E行第F列的值。
eg:输入:A = a0,a1 ,a2 ,a3;输出B=b0,b1 ,b2 ,b3
则(b0,b1 ,b2 ,b3)=τ(A)=(Sbox( a0),Sbox( a1),Sbox( a2),Sbox( a3))
(其中A为合成置换中的输入A:A=Xi+1 ⊕Xi+2 ⊕Xi+3⊕rki

2.线性变换L

c=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24)
其中B是32位的数,输出仍是32位
输入B的值为非线性变换τ输出的32的值

B<<<n:表示B循环左移n位,左边溢出的部分补到右边。
eg:B=123456。则 B<<<3 = 456123

4.加密的结果

32轮迭代后在最后会加上反序变换。
反序变换R:R(a0,a1 ,a2 ,a3)=(a3,a2 ,a1 ,a0)
密文为(Y0,Y1 ,Y2 ,Y3) =R(X32,X33 ,X34 ,X35)=(X35,X34 ,X33 ,X32)


总结

上面写的有点乱。
在EBC模式下SM4算法的流程如下:
SM4
如果有写的不对的地方欢迎指出!


http://www.ppmy.cn/news/2020.html

相关文章

【Map 和 WeakMap 的区别】

Map 1.传统对象结构 Map本质上是一个键值对的集合。和传统对象结构相比&#xff0c;传统对象只能用字符串作为键名&#xff0c;这在使用上造成了很大的限制。 const data {} //element为节点对象 const element document.querySelector(.node) console.log(element) //输…

探花交友_第2章_环境搭建(新版)

探花交友_第2章_环境搭建&#xff08;新版&#xff09; 文章目录探花交友_第2章_环境搭建&#xff08;新版&#xff09;课程介绍 《探花交友》1、项目介绍1.1、项目背景1.2、市场分析1.3、目标用户群体1.4、使用场景1.5、竞争对手分析1.5.1、竞品选择1.5.2、竞品分析1.6、项目简…

Transformer Encoder-Decoer 结构回顾

有关于Transformer、BERT及其各种变体的详细介绍请参照笔者另一篇博客&#xff1a;最火的几个全网络预训练模型梳理整合&#xff08;BERT、ALBERT、XLNet详解&#xff09;。 本文基于对T5一文的理解&#xff0c;再重新回顾一下有关于auto-encoder、auto-regressive等常见概念&…

一个基于.Net高性能跨平台内网穿透工具

作为一名程序员&#xff0c;我们平常需要调试远程API&#xff08;如公众号回调&#xff09;、远程操作公司内部、家里的电脑&#xff0c;我们都会用到内网穿透的工具。 今天给大家推荐一个高性能跨平台内网穿透工具的开源项目。 项目简介 一个基于.Net开发的内网穿透工具&am…

用代码画两棵圣诞树送给你【附详细代码】

大家好&#xff0c;我是宁一 代码的魔力之处在于&#xff0c;可以帮我们实现许多奇奇怪怪、有趣的想法。 比如&#xff0c;用Python的Turtle库&#xff0c;可以帮我们在电脑上画出好看的图像。 下面这张樱花图就是用Turtle库实现的。 这不圣诞节快到啦。 那么就用代码来画一…

人工智能与机器学习

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 人工智能与机器学习&#x1f4dd;人工智能相关概念☞什么是人工智能、机器学习、深度学习☞人工智能发…

基于机器学习之模型树短期负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

【Linux】【编译】make编译中打印日志的操作技巧

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Linux技术&…