【密码学】四、SM4分组密码算法

news2024/9/20 8:03:07

SM4分组密码算法

  • 1、概述
    • 1.1初始变量算法
    • 1.2密钥扩展算法
    • 1.3轮函数F
      • 1.3.1合成置换T
      • 1.3.2S盒
  • 2、算法设计原理
    • 2.1非平衡Feistel网络
    • 2.2T变换
      • 2.2.1非线性变换τ
      • 2.2.2线性变换L
      • 2.2.3基础置换
    • 2.3密钥扩展算法的设计

1、概述

SM4分组密码算法是一种迭代分组密码算法,采用非平衡Feistel结构,分组长度为128bit,
①Z2e表示e-比特的向量集,Z232中的元素称为字,Z28中的元素称为字节
②S盒为固定的8bit输入8bit输出的置换,记为Sbox()
③⊕表示2bit异或;<<<i表示32bit循环左移i位
④密钥及密钥参量
加密密钥长度位128bit,表示MK=(MK0,MK1,MK2,MK3),分别是字。
轮密钥rk是由加密密钥生成。
FK是系统参数,CK是固定参数,用于密钥扩展算法。

1.1初始变量算法

反序变换为R(A0,A1,A2,A3)=(A3,A2,A1,A0)
算法的加密变换为:Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=Xi⊕T(Xi+1i⊕Xi+2i⊕Xi+3i⊕rki)
(Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32)
其中,F是轮函数,T是合成置换
加解密的结构相同,但是轮密钥的使用顺序不一样,加密的时候是0-31,解密的时候是31-0
加密流程图如下:
加密流程图
轮函数如图:
轮函数

1.2密钥扩展算法

轮密钥生成方法:

(K0,K1,K2,K3) = (MK0⊕FK0,MK1⊕FK1,MK2⊕FK2,MK3⊕FK3)

rki=K(i+4) = Ki⊕T’(Ki+1)⊕Ki+2⊕Ki+3⊕CKi
T’变换与加密算法轮函数的T基本相同,只是将线性变换L变成L’,也就是:
 L’(B)=B⊕(B<<<13)⊕(B<<<23)

常数FK的值:
FK0=(A3B1BAC6)
FK1=(56AA3350)
FK2=(677D9197)
FK3=(B27022DC)
固定参数CK的取值
一共使用有32个固定参数CKi,CKi,是一个字,它的产生规则是:

设cki,j为CKi的第j字节(i=0,1,…,31;j=0,1,2,3),即CKj=(cki,0,cki,1,cki,2,cki,3),

则 cki,j=(4i+j)×7(mod 256)
下面是32个固定参数CK的十六进制表示形式的具体值:
CK

1.3轮函数F

算法采用非线性迭代结构,以字为单位进行加密运算,称一次迭代运算为一轮变换。
F(X0,X1,X2,X3)=X0⊕T(X1⊕X2⊕X3⊕rk0)

1.3.1合成置换T

T是一个可逆变换,由非线性变换τ和线性变换L复合而成,即T(·)=L(r(·))
非线性变换r由4个并行的S盒组成,输出bi,输入ai,则bi=Sbox(ai)
非线性变换r的输出是线性变换L的输入。输出C,输入B,则
C=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕(B<<<18)⊕(B<<<24)

1.3.2S盒

其中数据均为十六进制表示,设其输入为EF,则输出结果是第E行第F列的值,也就是Sbox(EF)=0x84
S盒
SM4分组密码算法的ECB模式:
ECB模式的工作方式的运算实例用以验证密码算法的正确性。
ECB

2、算法设计原理

2.1非平衡Feistel网络

平衡网络可以保证可逆性,可以构造高复杂度的f函数,不用在意其可逆性,也不需要实现加密和解密两种不同的算法,Feistel网络可以自动实现。但是现在设计的分组密码要求至少是128Bit,那么分组长度的增加就会导致轮函数f规模的增加。
非平衡Feistel网络将明文分为n个运算字,进行n次迭代就能将明文全部覆盖一遍。

2.2T变换

T变换是由非线性变换τ和线性变换L复合而成的,在SM4中起到了混淆和扩散的作用。

2.2.1非线性变换τ

τ变换是一种以字为单位的非线性代替变换,由4个S盒并置构成,本质上是S盒的一种并行应用,即将32位的字分为4个8位的字节分别进行S盒置换,因此其混淆作用体现在S盒中。

2.2.2线性变换L

L是以字为处理单位的线性变换,输入输出都是32位的字,主要起扩散作用。在异或和循环左移的结合运算下,可以使S盒输出值打乱,增加了各个输出值的相关性,使S盒的输出得到了扩散,使得密码算法能够抵抗拆分分析和线性分析。

2.2.3基础置换

基础置换的密码学性质决定明密文变换的效率。
SM4分组密码算法的单轮变换构成正形置换,其密码特性可以由正形置换的性质推出。
①SM4算法在不同密钥作用下的轮变换必然不同
②单轮变换在不同的密钥作用下,输入明文相同而输出比如不同

2.3密钥扩展算法的设计

子密钥是由加密密钥派生的,理论上子密钥总是统计相关的。密钥扩展算法的目的就是使子密钥间的统计相关性不易被破解利用,或者说使子密钥看上去更像是统计独立的。
①子密钥间不存在明显的统计相关性。
②没有弱密钥
③密钥扩展的速度不低于加密算法的速度,且资源占用少。
④由加密密钥可以直接生成任何一个子密钥。

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

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

相关文章

使用requests库发送http请求

1. get请求 # 导入requests库 import requests# 此处使用的接口地址为zrlog系统后台登录首页的地址 url "http://172.16.171.129/admin/login"# 通过requests库发送get请求 r requests.get(url url)# 以文本的方式返回响应内容 print(r.text)# 返回HTTP协议状态码…

qssh使用

到官网下载qssh的源码QSsh-botan-1&#xff0c;使用qtcreator打开后&#xff0c;直接编译&#xff0c;即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下&#xff0c;即为库头文件。 qssh有个问题&#xff0c;如果你将qssh的类放在子线程…

定时发朋友圈怎么设置?

目前微信作为最大的社交平台之一&#xff0c;吸引了众多使用者。你是否听过有些朋友感叹这么多微信号&#xff0c;需要每天手动发布朋友圈&#xff0c;任务很繁琐呢&#xff1f;是否希望可以事先设置好定时发送的功能&#xff0c;让朋友圈自动更新&#xff0c;省去手动发送的麻…

sqlserver row _number函数的运用

sql语句&#xff1a; select dept_id,stcd,row_number() over (partition by dept_id ORDER BY STCD) as 排序 from tb_station_config 这段代码是使用ROW_NUMBER()函数结合窗口函数的语法&#xff0c;用于给结果集中的每一行分配一个唯一的序号。 具体解释如下&#xff1a; R…

uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)

本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定位信息, 位置更新也会触发相关自定义事件 优点 只设置一次不采用定时器的方式无需多个页面调用单独页面若想获取当前位置是否变化 可单独设置监听,并调用不同逻辑事件 原理: 采用uniapp推出的: un…

基于深度强化学习的DQN模型实现自动玩俄罗斯方块游戏(附详细代码讲解)

一、DQN&#xff08;Deep Q-Network&#xff09;方法概述 DQN&#xff08;Deep Q-Network&#xff09;是一种强化学习方法&#xff0c;通过结合Q-learning算法和深度神经网络来解决强化学习问题。它是深度强化学习的里程碑之一&#xff0c;由DeepMind在2013年提出&#xff0c;被…

【SQL Server】DBCC CHECKDB只是一个数据库维护命令吗?

日期&#xff1a;2023年7月27日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

【数据仓库】Apache Hive初体验

为什么使用Hive&#xff1f; 使用Hadoop MapReduce直接处理数据所面临的问题&#xff1a; 人员学习成本太高需要掌握ava语言MapReduce实现&#xff0c;复杂查询逻辑开发难度太大&#xff01; 1&#xff0c;使用Hive处理数据的好处操作接口采用类SQL语法&#xff0c;提供快速开发…

MUR2080CT- ASEMI二极管的特性和应用

编辑-Z 本文将详细介绍MUR2080CT二极管的特性和应用。首先&#xff0c;将介绍MUR2080CT二极管的基本结构和工作原理。然后&#xff0c;将探讨MUR2080CT二极管的特性&#xff0c;包括正向电压降、反向漏电流和反向恢复时间等。接下来&#xff0c;将介绍MUR2080CT二极管在电源、…

linux环境安装mysql数据库

一&#xff1a;查看是否自带mariadb数据库 命令&#xff1a;rpm -qa | grep mariadb 如果自带数据库则卸载掉重新安装 命令&#xff1a;yum remove mariadb-connector-c-3.1.11-2.el8_3.x86_64 二&#xff1a;将压缩文件上传到/user/local/mysql文件夹 或者直接下载 命令&a…

18款iPad绘画软件推荐!iPad必备生产力工具

每当提起iPad&#xff0c;少不了会听到坊间流传已久的那句话&#xff0c;「买前生产力&#xff0c;买后爱奇艺」&#xff0c;确实有不少奔着生产力入手iPad的人&#xff0c;最终让iPad沦为煲剧神器或泡面盖&#xff0c;但我们没必要因噎废食&#xff0c;因为总有人能克服iPad上…

互联网医院系统源码实现:打造现代化医疗服务平台

摘要 本文将介绍一个基于Python的简化版互联网医院系统的源码实现&#xff0c;主要包含用户注册与登录、医生信息管理、在线预约挂号、在线问诊与咨询、电子病历管理、在线支付与结算等功能。该源码实现仅为示例&#xff0c;实际开发中需要考虑更多的业务逻辑和安全性。 1. …

摄像头m2dock(MAIX-II DOCK)

官方文档地址 https://wiki.sipeed.com/soft/maixpy3/zh/index.html 一、软件准备 1 烧录镜像软件 2 镜像 当前最近版本镜像文件 3 SDFormatter 4 Maixpy IDE 二、SD卡准备 1 格式化SD卡&#xff08;用SDFormatter&#xff09; 2 烧录 3 弹出&#xff0c;插入开发板中 出现…

会议OA项目之待开历史所有会议(使用一个dao方法完成三种会议状态的查询)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.主要功能点介绍 二.效果演示 三.前端…

多线程(JavaEE初阶系列5)

目录 前言&#xff1a; 1.什么是定时器 2.标准库中的定时器及使用 3.实现定时器 结束语&#xff1a; 前言&#xff1a; 在上一节中小编给大家介绍了多线程中的两个设计模式&#xff0c;单例模式和阻塞式队列模式&#xff0c;在单例模式中又有两种实现方式一种是懒汉模式&a…

小白如何在简单的分布式锁里反复踩坑

背景 为什么要做分布式锁&#xff1f; Java开发就逃不过多线程问题&#xff0c;而对于单个实例&#xff0c;我们可以使用synchronized锁作为基本的线程锁&#xff0c;解决多线程问题&#xff0c;但对于实际项目中集群部署&#xff0c;分布式系统&#xff08;不同的客户端&…

HTML再出发

HTML再出发 注意事项VScode相关排版标签语义化块级元素和行内元素文本标签img标签图片格式超链接 注意事项 VScode相关 vscode必须打开一个文件夹才能使用liveServer&#xff0c;只打开一个文件无法使用liveServer功能。网页编写不标准&#xff0c;缺少head&#xff0c;body等…

java springBoot 整合日志

1.在Spring Boot项目的resources目录下创建一个新的logback.xml文件。 2.logback.xml中&#xff0c;配置 代码 <?xml version"1.0" encoding"UTF-8"?> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL…

SpringBoot复习:(4)打成的jar包是如何启动的?

jar包通过MANIFEST的Main-Class指定了主类JarLauncher, JarLauncher的main方法代码如下&#xff1a; 其中调用的launch的代码如下&#xff1a; 首先&#xff0c;创建了一个自定义的ClassLoader,代码如下&#xff1a; 其中调用的重载的createClassLoader代码如下&#xff1…

BloomFilter

概念和由来 布隆过滤器&#xff08;英语&#xff1a;Bloom Filter&#xff09;是 1970 年由布隆提出的。它实际上是一个很长的二进制数组(00000000)一系列随机hash算法映射函数&#xff0c;主要用于判断一个元素是否在集合中。 布隆过滤器适用于对存储空间要求较高&#xff0c…