安全基础学习-SM4加密算法

SM4 是一种中国国家密码标准(GB/T 32907-2016)中定义的分组加密算法,又称为“中国商用密码算法SM4”。它是由中国国家密码管理局发布的,并广泛应用于金融、电子商务和其他需要数据加密的场景。

1、SM4 算法概述

SM4 是一种对称加密算法,意味着加密和解密使用相同的密钥。它是一个 128 位(16 字节)分组密码,意味着它将明文分成 128 位的块,然后对每个块进行加密。SM4 使用了 128 位的密钥进行加密和解密。

SM4 算法的主要特点是:

分组长度:128 位。
密钥长度:128 位。
加密模式:支持多种模式,如ECB(电子密码本)、CBC(加密分组链接)、CTR(计数器模式)等。

2、SM4 的工作原理

SM4 的加密和解密过程主要由以下几个部分组成:

  1. 密钥扩展:从 128 位的主密钥生成 32 个轮密钥,每个轮密钥长度为 32 位。
    在这里插入图片描述

  2. 轮函数:加密和解密过程中,明文(或密文)经过 32 轮的迭代计算,每一轮使用一个轮密钥。
    在这里插入图片描述

  3. 非线性变换函数 τ:τ 是一个基于 S 盒的非线性变换,将 32 位输入数据通过 S 盒转换为 32 位输出数据。
    S 盒的每个字节输入都映射到一个输出字节。
    在这里插入图片描述

  4. 线性变换函数 L:L 是一个线性变换函数,它对输入数据进行移位和异或操作来实现扩散效果。
    C=L(B)=B⨁(B<<<2)⨁(B<<<10)⨁(B<<<18)⨁(B<<<24)

3、SM4 的实现步骤

3.1 参数设置

  • 输入数据:128 位的明文或密文数据。
  • 密钥:128 位的加密密钥。
  • 轮数:32 轮加密或解密操作。

3.2 密钥扩展 (Key Expansion)

SM4 使用一个 128 位的主密钥 MK 生成 32 个轮密钥 RK。
通过以下步骤生成轮密钥:

  1. 密钥初始化:将 MK 分为四个 32 位的部分 MK[0], MK[1], MK[2], MK[3],然后通过线性变换得到 K[0], K[1], K[2], K[3]。
  2. 轮密钥生成:从 K[0] 到 K[3] 开始,通过每轮的线性变换和非线性变换生成新的密钥 K[i],最终得到 32 个轮密钥 RK[0] 到 RK[31]。

3.3 加密过程 (Encryption Process)

加密过程包括 32 轮迭代,每轮都使用一个不同的轮密钥 RK。
具体步骤如下:

  1. 数据初始化:将 128 位明文 P 分为四个 32 位的部分 X[0], X[1], X[2], X[3]。
  2. 32 轮迭代:对于每一轮 i,执行以下操作:
    • 使用非线性变换函数 τ 和线性变换函数 L,结合当前状态 X[i-3], X[i-2], X[i-1], X[i] 和轮密钥 RK[i] 计算新状态 X[i+1]。
    • 新状态的计算公式为:
      X[i+1]=X[i−3]⊕L(τ(X[i]⊕X[i−1]⊕X[i−2]⊕RK[i]))
  3. 最终状态:在第 32 轮结束后,四个 32 位的状态 X[35], X[34], X[33], X[32] 将作为加密后的密文输出。

在这里插入图片描述

3.4 解密过程 (Decryption Process)

  • 解密过程与加密过程类似,但轮密钥的使用顺序相反。
  • 使用与加密相同的函数和操作步骤,只是在每轮中使用的轮密钥顺序相反,即从 RK[31] 到 RK[0]。

在这里插入图片描述

4、数据举例

  • 明文(128 位):0x0123456789ABCDEFFEDCBA9876543210
  • 密钥(128 位):0x0123456789ABCDEFFEDCBA9876543210

4.1 密钥扩展 (Key Expansion)

首先,将 128 位的密钥 MK 分为四个 32 位的部分:

MK[0] = 0x01234567
MK[1] = 0x89ABCDEF
MK[2] = 0xFEDCBA98
MK[3] = 0x76543210

接下来,定义系统参数 FK 和 CK,然后通过公式生成初始密钥 K[0], K[1], K[2], K[3]。计算过程如下:

K[0] = MK[0] ⊕ FK[0]
K[1] = MK[1] ⊕ FK[1]
K[2] = MK[2] ⊕ FK[2]
K[3] = MK[3] ⊕ FK[3]

假设 FK 的值为:

FK[0] = 0xA3B1BAC6
FK[1] = 0x56AA3350
FK[2] = 0x677D9197
FK[3] = 0xB27022DC

计算得到:

K[0] = 0xA3B1BAC6 ⊕ 0x01234567 = 0xA3928FE1
K[1] = 0x56AA3350 ⊕ 0x89ABCDEF = 0xDF01FE9F
K[2] = 0x677D9197 ⊕ 0xFEDCBA98 = 0x9971AB0F
K[3] = 0xB27022DC ⊕ 0x76543210 = 0xC42410CC

通过 32 轮迭代生成每一轮的轮密钥 RK。在此只演示前几轮的轮密钥生成:

RK[0] = K[0] ⊕ L(τ(K[1] ⊕ K[2] ⊕ K[3] ⊕ CK[0]))
RK[1] = K[1] ⊕ L(τ(K[2] ⊕ K[3] ⊕ RK[0] ⊕ CK[1]))

4.2 加密过程 (Encryption Process)

将 128 位的明文 P 分为四个 32 位的部分:

X[0] = 0x01234567
X[1] = 0x89ABCDEF
X[2] = 0xFEDCBA98
X[3] = 0x76543210

通过 32 轮迭代计算每一轮的新状态 X[i+1]。同样,我们只演示前几轮的计算:

X[4] = X[0] ⊕ L(τ(X[1] ⊕ X[2] ⊕ X[3] ⊕ RK[0]))
X[5] = X[1] ⊕ L(τ(X[2] ⊕ X[3] ⊕ X[4] ⊕ RK[1]))

以此类推,直至第 32 轮计算完成。

4.3 最终密文生成

在第 32 轮结束后,四个 32 位的状态 X[35], X[34], X[33], X[32] 将作为加密后的密文输出。最终密文将是这四个 32 位状态的组合。

例如,假设最终结果为:

X[32] = 0xF58A8A5C
X[33] = 0x70F7C3A7
X[34] = 0xA8E62D79
X[35] = 0xD2F0C1BC

则输出密文为:0xF58A8A5C70F7C3A7A8E62D79D2F0C1BC

4.4 解密过程

解密过程与加密过程类似,只需将轮密钥 RK 的顺序逆转,从 RK[31] 到 RK[0] 使用同样的操作。

5、应用模式

SM4 可以结合多种模式使用,例如 ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB(密码反馈模式)、OFB(输出反馈模式)等,以适应不同的应用场景。

6、python实现(ECB模式)

# SM4 Implementation in Python# Constants used in SM4
FK = [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC]
CK = [0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269, 0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9,0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249, 0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9,0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229, 0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299,0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209, 0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279
]# S-box
SBOX = [# 16x16 S-Box Table0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用WINUI3 编写一个小软件1 C#

本篇主要是记录安装和运行的问题。 先说安装 因为我是WIN11&#xff0c;所以勾了&#xff0c;如果你是WIN10就不用勾选11那个&#xff0c;但是我不确定用11要不要10那个&#xff0c;所以就勾了&#xff0c;按安装手册来的。 2、创建项目 照着选就完事了&#xff0c;别选错 这…

【数据结构与算法】快速排序

快速排序目录 一.快速排序的原理二.快速排序的图解三.快速排序的实现1.基准两边分2.分而治之 四.完整代码 一.快速排序的原理 每次选取第一个数为基准数.然后使用乾坤大挪移将大于或者小于基准的元素分别放置于基准数两边.继续分别对基准数两侧未排序的数据使用分治法进行处理…

springboot项目配置https安装ssl证书教程

1.将下载的ssl证书文件中的jks后缀文件放在/src/main/resource文件夹里面 2.在配置文件中&#xff08;yml后缀配置文件的格式不同&#xff09;添加如下配置即可

Postman接口测试项目实战

第 1 章 什么是接口测试 1.1、为什么要进行接口测试 目前除了特别Low的公司外&#xff0c;开发都是前后端分离的&#xff0c;就是说前端有前端的工程师进行编码&#xff0c;后端有后端的工程师进行编码&#xff0c;前后端进行数据基本都是通过接口进行交互的。 1.2、接口测…

IDEA:如何在idea中设置自动导包

这里使用的是idea2020版本,但是不同版本操作不会有较大的差别. 在Editer中展开General之后,选中Auto Import,最后勾选中Add unambiguous imports on the fly.

Java Web|day5.MyBatis

MyBatis 定义 它是一款半自动的ORM持久层框架&#xff0c;具有较高的SQL灵活性&#xff0c;支持高级映射(一对一&#xff0c;一对多)&#xff0c;动态SQL&#xff0c;延迟加载和缓存等特性&#xff0c;但它的数据库无关性较低 **ORM: **Object Relation Mapping&#xff0c;…

培训学校课程管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

Java面试--框架--Spring MVC

Spring MVC 目录 Spring MVC1.spring mvc简介2.spring mvc实现原理2.1核心组件2.2工作流程 3.RESTful 风格4.Cookie&#xff0c;Session4.1 会话4.2 保存会话的两种技术 5.拦截器5.1过滤器、监听器、拦截器的对比5.2 过滤器的实现5.3 拦截器基本概念5.4 拦截器的实现 1.spring …

如何使用unittest和pytest进行python脚本的单元测试

1. 关于unittest和pytest unittest是python内置的支持单元测试的模块&#xff0c;他提供了核心类&#xff0c;TestCase&#xff0c;让单元测试 代码的编写不再是从0开始&#xff0c;不再是作坊式&#xff0c;而是标准化&#xff0c;模板化&#xff0c;工厂化。 pytest是第三方…

【深度解析】WRF-LES与PALM微尺度气象大涡模拟

查看原文>>>【深度解析】WRF-LES与PALM微尺度气象大涡模拟 针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和…

Linux - 模拟实现 shell 命令行解释器

目录 简介 shell 的重要性 解释为什么学习 shell 的工作原理很重要 模拟实现一个简单的 shell 循环过程 1. 获取命令行 2. 解析命令行 3. 建立一个子进程&#xff08;fork&#xff09; 4. 替换子进程&#xff08;execvp&#xff09; 5. 父进程等待子进程退出&#xff08;wai…

合宙LuatOS AIR700 IPV6 TCP 客户端向NodeRed发送数据

为了验证 AIR700 IPV6 &#xff0c;特别新建向NodeRed Tcp发送的工程。 Air700发送TCP数据源码如下&#xff1a; --[[ IPv6客户端演示, 仅EC618系列支持, 例如Air780E/Air600E/Air780UG/Air700E ]]-- LuaTools需要PROJECT和VERSION这两个信息 PROJECT "IPV6_SendDate_N…

Jupyter安装指南:最简便最详细的步骤

一.介绍 JupyterNotebook 是一个款以网页为基础的交互计算环境&#xff0c;可以创建Jupyter的文档&#xff0c;支持多种语言&#xff0c;包括Python, Julia, R等等。一般来说&#xff0c;如果是使用R语言的话&#xff0c;使用Rstudio居多&#xff0c;使用Python的话&#xff0…

开源的数据库增量订阅和消费的中间件——Cancl

目录 工作原理 MySQL主备复制原理 Canal 工作原理 主要功能和特点 应用场景 实验准备 安装JDK11 下载MySQL8.0 配置canal.admin 配置canal-deployer 测试数据读取 新增一台主机用做被同步的目标机器测试 官方地址&#xff1a;https://github.com/alibaba/canal?ta…

【gitlab】gitlab-ce:17.3.0-ce.0 1:使用docker engine安装

ce版本必须配置代理。 极狐版本可以直接pull 社区版GitLab不支持Alibaba Cloud Linux 3,本操作以Ubuntu/Debian系统为例进行说明,其他操作系统安装说明,请参见安装社区版GitLab。 docker 环境重启 sudo systemctl daemon-reload sudo systemctl restart docker脚本安装 安裝…

宝塔面板实现定时任务删除 logs文件 加条件删除 只删除一个月前的日志

我们在开发中难免用到了日志功能&#xff0c;随着日志越来越多导致占用我们的内存 下面是一个简单的 使用宝塔面板里面的定时任务来实现删除日志案例 第一步 首先我的日志文件目录 都在log文件夹里面&#xff0c; 每个月生成一个日志文件夹 文件夹命名是年月来命名的 第二…

探索深度学习的力量:从人工智能到计算机视觉的未来科技革命

目录 1. 引言 2. 人工智能的历史背景 3. 深度学习的崛起 3.1 深度神经网络的基本原理 4. 计算机视觉的发展现状 4.1 传统计算机视觉与深度学习的结合 5. 深度学习在计算机视觉中的应用 5.1 图像分类 5.2 目标检测 6. 深度学习引领的未来科技创新与变革 7. 结论 引言…

【vue3+Typescript】手撸了一个轻量uniapp导航条

最近公共组件写到导航条&#xff0c;本来打算拿已有的改。看了下uniapp市场上已有的组件&#xff0c;一是不支持vue3typescript&#xff0c;二是包装过重。索性自己手撸了一个导航条&#xff0c;不到100行代码全部搞定&#xff0c;因为自己的需求很简单&#xff1a; 1&#xf…

pycharm2023.1破解

下载解压文件&#xff0c;文件夹 /jetbra 复制电脑某个位置 注意&#xff1a; 补丁所属文件夹需单独存放&#xff0c;且放置的路径不要有中文与空格&#xff0c;以免 Pycharm 读取补丁错误。 点击进入 /jetbra 补丁目录&#xff0c;再点击进入 /scripts 文件夹&#xff0c;双…

javaer快速入门 goweb框架 gin

gin 入门 前置条件 安装环境 配置代理 # 配置 GOPROXY 环境变量&#xff0c;以下三选一# 1. 七牛 CDN go env -w GOPROXYhttps://goproxy.cn,direct# 2. 阿里云 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct# 3. 官方 go env -w GOPROXYhttps://goproxy.…