SM4算法详解(2021-12-8)
原文链接1:https://www.cnblogs.com/kentle/p/14135865.html
原文链接2:https://www.cnblogs.com/kentle/p/14135865.html
国密局官方文档:http://www.gmbz.org.cn/main/viewfile/20180108015408199368.html
文章目录
- 使用场景
- SM4概述
- 加密流程
- 1.加密过程概述:
- 2.32次轮迭代
- 解密流程
- 密钥扩展算法
使用场景
- 无需进行密钥交换的场景,如内部系统,事先就可以直接确定密钥
- 防止明文传输数据被窃取的
- 加解密速度快,适合数据内容比较大的加密场景
SM4概述
补充:密码算法中常用的一些数据单位:
**位/比特/bit*:指一个二进制位***。
***字节/byte***: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-frQl5jEG-1638947146609)(https://www.zhihu.com/equation?tex=1%5C+%E5%AD%97%E8%8A%82%3D8%5C+%E4%BD%8D)]
***字/word***: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1C5vje0e-1638947146611)(https://www.zhihu.com/equation?tex=1%5C+%E5%AD%97%3D4%5C+%E5%AD%97%E8%8A%82%3D32%5C+%E4%BD%8D)]
SM4是一种分组密码算法,其分组长度为128位(即16字节,4字),密钥长度也为128位(即16字节,4字)。其加解密过程采用了32轮迭代机制(与DES、AES类似),每一轮需要一个轮密钥(与DES、AES类似)。
加密流程
1.加密过程概述:
SM4的分组长度为4字,因此,其输入是4字的明文 (X0,X1,X2,X3)(X_0,X_1,X_2,X_3)(X0,X1,X2,X3)(其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMVnfPla-1638947146612)(https://www.zhihu.com/equation?tex=X_i)] 表示一个32位的字),经过加密后,得到的输出是4字的密文 (Y0,Y1,Y2,Y3)(Y_0,Y_1,Y_2,Y_3)(Y0,Y1,Y2,Y3)(其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYYp2AOC-1638947146612)(https://www.zhihu.com/equation?tex=Y_i)] 表示一个32位的字)。
这个加密过程分为两步,由32次轮迭代和1次反序变换组成。
2.32次轮迭代
输入的明文为 128bit 的数据,将其按位拆分成 4 个 32bit 的数据 x0,x1,x2,x3x_0,x_1,x_2,x_3x0,x1,x2,x3
当 i=0i=0 时为第一次轮变换,一直进行到 i=31i=31 结束
xix_ixi 暂时不做处理,将 xi+1,xi+2,xi+3x_{i+1},x_{i+2},x_{i+3}xi+1,xi+2,xi+3 和轮密钥 rkirkirki 异或得到一个 32bit 的数据,作为盒变换的输入
即 sbox-input=xi+1⊕xi+2⊕xi+3⊕rki=x_{i+1}⊕x_{i+2}⊕x_{i+3}⊕rki=xi+1⊕xi+2⊕xi+3⊕rki,⊕符号代表异或运算
将 sbox_input拆分成 4 个 8bit 数据,分别进行盒变换,之后再将 4 个 8bit 输出合并成一个 32bit 的 sbox_output
将刚才获得的 sbox_output分别循环左移 2,10,18,24 位,得到 4 个 32bit 的结果,记移位结果为 y2,y10,y18,y24y2,y10,y18,y24
将移位的结果 y2,y10,y18,y24与盒变换输出 sbox_outputsbox_output 和 xixi 异或,得到 xi+4xi+4
即 xi+4=sbox_output⊕y2⊕y10⊕y18⊕y24⊕xixi+4=sbox_output⊕y2⊕y10⊕y18⊕y24⊕xi至此完成了一轮的加解密运算
在实际加解密过程中,上述运算要执行 32 轮,同时使用 32 个不同的 rkirki,rkirki 由密钥拓展生成最后将生成的最后 4 个 32bit 数据 x35,x34,x33,x32x35,x34,x33,x32 合并成一个 128bit 的数据 outputoutput,作为最后的输出结果
解密流程
密钥扩展算法
- 密钥拓展的过程和加解密大同小异
- 输入的原始密钥 keykey 为 128bit 的数据,将其按位拆分成 4 个 3232bit 的数据 K0,K1,K2,K3K0,K1,K2,K3
- 将初始密钥 K0,K1,K2,K3K0,K1,K2,K3 分别异或固定参数 FK0,FK1,FK2,FK3FK0,FK1,FK2,FK3 得到用于循环的密钥 k0,k1,k2,k3k0,k1,k2,k3
即 k0=K0⊕FK0,k1=K1⊕FK1,k2=K2⊕FK2,k3=K3⊕FK3k0=K0⊕FK0,k1=K1⊕FK1,k2=K2⊕FK2,k3=K3⊕FK3 - 进入轮密钥 rkirki 的生成
当 i=0i=0 时为第一次轮变换,一直进行到 i=31i=31 结束 - kiki 暂时不做处理,将 ki+1,ki+2,ki+3ki+1,ki+2,ki+3 和固定参数 CKiCKi 异或得到一个 32bit 的数据,作为盒变换的输入
即 sbox_input=ki+1⊕ki+2⊕ki+3⊕ckisbox_input=ki+1⊕ki+2⊕ki+3⊕cki - 将 sbox_inputsbox_input 拆分成 4 个 8bit 数据,分别进行盒变换,之后再将 4 个 8bit 输出合并成一个 32bit 的 sbox_outputsbox_output
- 将刚才获得的 sbox_outputsbox_output 分别循环左移 13,23 位,得到 2 个 32bit 的结果,记移位结果为 y13,y23y13,y23
- 将移位的结果 y13,y23y13,y23 与盒变换输出 sbox_outputsbox_output 和 kiki 异或,得到 ki+4ki+4
即 rki=ki+4=sbox_output⊕y13⊕y23⊕kirki=ki+4=sbox_output⊕y13⊕y23⊕ki - 至此完成了一轮的加解密运算
在实际加解密过程中,上述运算要执行 32 轮,同时使用 32 个不同的 CKiCKi,CKiCKi 为固定参数 - 执行完 32 轮后,便可获得 32 个用于加解密的 rki
SM4算法详解(2021-12-8)相关推荐
- java break 在if 中使用_java中使用国密SM4算法详解
前言 上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法.对称加密,密钥长度和分组长度均为128位. ps:我们既可 ...
- Java学习日报—Swagger介绍 与 布隆过滤器详解—2021/12/01
目录 1. Swagger 1.1 介绍 1.2 Swagger 的优势 1.3 简单使用 1.3.1 集成 Swagger 管理 API 文档 1.3.2 在线测试接口 1.4 常用注解 1.5 参 ...
- c4.5算法 程序语言,决策树之C4.5算法详解-Go语言中文社区
决策树之C4.5算法详解 主要内容 C4.5算法简介 分裂属性的选择--信息增益率 连续型属性的离散化处理 剪枝--PEP(Pessimistic Error Pruning)剪枝法 缺失属性值的处理 ...
- YOLOv5算法详解
目录 1.需求解读 2.YOLOv5算法简介 3.YOLOv5算法详解 3.1 YOLOv5网络架构 3.2 YOLOv5实现细节详解 3.2.1 YOLOv5基础组件 3.2.2 输入端细节详解 3 ...
- 聚类 python_python中实现k-means聚类算法详解
算法优缺点: 优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近 ...
- NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python)
NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python) NEAT算法详解 NEAT算法概述 NEAT编码方案 结构突变 ...
- 生物信息学(4)——多序列比对之CLUSTAL算法详解及C++实现
生物信息学系列博客索引 生物信息学(1)--双序列比对之Needleman-Wunsch(NW)算法详解及C++实现 生物信息学(2)--双序列比对之Smith-Waterman(SW)算法详解 生物 ...
- 基于多相滤波器的数字信道化算法详解(Python, Verilog代码已开源)
基于多相滤波器的数字信道化算法详解 推导过程 总结 仿真 本文详细介绍了基于多相滤波器的数字信道化算法的推导过程, 如果您在阅读的过程中发现算法推导过程中有任何错误, 请不吝指出. 此外, 进入我的G ...
- 离线强化学习(Offline RL)系列3: (算法篇) IQL(Implicit Q-learning)算法详解与实现
[更新记录] 论文信息:Ilya Kostrikov, Ashvin Nair, Sergey Levine: "Offline Reinforcement Learning with Im ...
- 蚂蚁算法python_Python编程实现蚁群算法详解
简介 蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法.它由Marco Dorigo于1992年在他的博士论文中提出,其灵感 ...
最新文章
- pythonrequest方法_解决Python requests 报错方法集锦
- Linux Kernel TCP/IP Stack — L1 Layer — Network Interface
- [Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]
- java工作笔记018---java中BigDecimal小数位数的四舍五入等操作
- springboot2.0新特性
- 前景检测算法(十一)--基于LBP纹理
- 小程序方法-小程序获取上一页的数据修改上一个页面的数据
- 枚举算法典型的三个例子
- 【信息安全技术】期末复习考点汇总
- java生命之树_珍惜生命的心得感想与体会
- 4字母域名价值高吗?目前值多少钱?
- 快乐总动员 幸福你我他——龙营华夏第五届届亲子运动会
- MYSQL No space left on device
- python多元回归分析_多变量分析:多元回归分析
- rsync运行时出现skipping non-regular file
- GO111MODULE作用
- centos 开启关闭网卡(禁用网卡)
- UltraEdit正则表达式使用(Regular Expressions in UltraEdit)
- php支付宝提现demo,php 支付宝 支付Demo模板
- 读保哥《ASP.NET MVC2开发实战》第二回(Model)
热门文章
- lamp整合三连发(1)
- 07版qq默认经典表情下载
- html中怎么给网页添加音乐播放器,怎么给网站或网页添加音乐
- android框架揭秘!Android开发你需要了解的那些事,附大厂真题面经
- “程序员的理财计划”-待完善
- 【Windows10】C盘快速扩容小妙招
- PCB板自动识别检测
- 中国游戏2022趋势报告:6大潜力领域4大发展趋势 多家企业分析
- 打印机测试图_国产彩色激光机一样很靠谱 奔图全新彩色激光机到底怎么样?...
- 魔方Newlife.Cube权限系统的使用及模版覆盖详解