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

news2024/12/26 17:44:05

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 Table
    0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 

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

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

相关文章

升级 kubeadm 部署的 k8s 集群

文章目录 一、环境二、注意事项1、备份数据2、跨版本升级3、支持的版本偏差3.1、kube-apiserver3.2、kubeklet3.3、kube-proxy3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager3.5、kubectl 4、升级流程 三、版本升级&#xff08;补丁版本升级&#…

css 文字图片居中及网格布局

以下内容纯自已个人理解&#xff0c;直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

ervlet、jsp、Cookie、Ajax学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

Nginx 正则表达式与rewrite

目录 一、正则表达式 二、rewrite 2.1 rewrite简述 2.2 rewrite 跳转 2.3 rewrite 执行顺序 2.4 rewrite 语法格式 三、location 3.1 location 类别 3.2 location常用匹配规则 3.3 location优先级 3.4 示例说明 3.5 匹配规则总结 3.6 三个匹配规则定义 四、实战…

【业务场景实战】如何优雅地进行缓存预热?

从Java基础到中间件再到微服务&#xff0c;我们学了这么多&#xff0c;但遇到真实项目的时候&#xff0c;还是不会根据所学知识&#xff0c;对项目进行改造&#xff1b;或者太久不用早已忘记。学会用才是走得更远&#xff01; 缓存穿透、雪崩&#xff0c;大家都不陌生&#xf…

【Linux操作系统】——Centos7下安装python3.8

1.Centos7下安装python3.8 1.1 安装依赖包 yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel ncurses-devel sqlite-devel readline-devel readline-devel make在CentOS 7上安装Python时&#xff0c;‌需要安装一些必要的依赖包以确保Python的正常编译和运…

HarmonyOS NEXT - 项目基础框架的搭建

demo 地址: https://github.com/iotjin/JhHarmonyDemo 代码不定时更新&#xff0c;请前往github查看最新代码 HarmonyOS NEXT - 项目基础框架的搭建 序前置工作项目的目录结构主界面实现BaseTabBar代码实现子页面实现路由跳转登录页面和主页面切换登录实现退出登录 序 项目基于…

Spark-环境启动

一、概览 从start-all.sh开始捋&#xff0c;一直捋到Master、Worker的启动并建立通信 二、宏观描述 Master端 1、start-all.sh调用start-master.sh启动Master 2、执行org.apache.spark.deploy.master.Master中main方法 3、通过工厂模式创建RpcEnv子类NettyRpcEnv a、创建…

viper配置文件读取管理库 一个支持12种文件类型,5种远程协议的配置文件管理和加载工具库 使用方法示例

viper是一个不错的配置文件管理库&#xff0c; 他支持的配置文件类型依次有 "json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "tfvars", "dotenv&quo…

java:实现简单的验证码功能

效果 实现思路 验证码图片的url由后端的一个Controller生成&#xff0c;前端请求这个Controller接口的时候根据当前时间生成一个uuid&#xff0c;并把这个uuid在前端使用localStorage缓存起来&#xff0c;下一次还是从缓存中获取。 Controller生成验证码之后&#xff0c;把前…

Qt 学习第六天:页面布局

如何设计页面&#xff1f; 有个类似沙盒模式的玩法&#xff0c;Qt Widget Designer可以更好的帮助我们设计页面 点击.ui文件进入 右上方可以看到四种常见的布局&#xff1a; 四种布局 &#xff08;一&#xff09;水平布局horizontalLayout&#xff1a;QHBoxLayout H 是 hori…

c++实现B树(上)

哈喽啊&#xff01;好久不见&#xff0c;甚是想念&#xff01;失踪人口要回归了&#xff0c;时隔一个多月小吉我终于要更新blog了&#x1f389;。在停更的一个多月中&#xff0c;小吉也有在好好学习提升自己&#xff0c;立志给大家呈现好文章。  现在让我们进入正题吧&#xf…

初识C++:开启C++之旅

目录 1.C的第一个程序 2.namesapce命名空间域 2.1namespace的意义 2.2.2namespace的定义 2.3命名空间的使用 3.C输入/输出 4.缺省参数 5.函数重载 6.引用 6.1引用的特性 6.2引用的使用 1.C的第一个程序 c版本&#xff1a; #include<iostream>using std::cout…

kali安装wechart

前言&#xff1a; 突发奇想想在kali安装个wechart&#xff0c;试了下网上的很多&#xff0c;玩坏了一个虚拟机算是找到了一个不错的方法&#xff0c;这里记录下&#xff0c;防迷路 基础配置&#xff1a; 首先修改源&#xff1a; vim /etc/apt/sources.list 注释默认配置&…

EasyCVR视频汇聚平台:打造全栈视频监控系统的基石,解锁可视化管理与高效运维

随着科技的飞速发展&#xff0c;视频监控已成为现代社会不可或缺的一部分&#xff0c;广泛应用于社区、公共场所、工业领域等多个场景。EasyCVR视频汇聚平台&#xff0c;作为一款高性能的视频汇聚管理平台&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;在构建全…

centos8 安装zookeeper

1&#xff1a;下载 zookeeper官网 解压&#xff1a;tar -zxvf apache-zookeeper-3.6.3.tar.gz 修改自己想要的文件目录 mv apache-zookeeper-3.6.3 zookeeper_3.6.3 备份一下 配置文件 cp zoo_sample.cfg zoo.cfg vim zoo.cfg 编辑日志文件和端口号

nginx实战演练

目录 一.Nginx架构和安装&#xff08;未完待续&#xff09; <1>.Nginx概述 <2>.Nginx架构和进程 <3>.Nginx模块 <4>.Nginx安装(编译安装) 二.Nginx基础配置 <1>.关闭debug <2>.将nginx软件添加到环境变量 <3>.开机自启动脚…

EmguCV学习笔记 VB.Net 2.5 Mat类、Matrix类和Image类的相互转换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址&#xff1a;VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…

基于Vue的MES生产制造执行系统

TOC springboot307基于Vue的MES生产制造执行系统 第1章 绪论 1.1 选题动因 到现在为止&#xff0c;互联网已经进入了千家万户&#xff0c;最普通的平民百姓也有属于自己的智能设备&#xff0c;计算机各种技术的储备也是相当的丰富&#xff0c;并且实现也是没有难度&#xf…

VSCode配置ssh免密连接远程服务器

我配置了免密设置(Windows利用ssh免密码登录Linux)&#xff0c;git bash已经能够正常连接了&#xff0c;但是vscode还是不行&#xff0c;很奇怪。 VSCode报错信息&#xff1a; [17:55:50.360] SSH Resolver called for "ssh-remote106.52.2.19", attempt 5, (Recon…