详解SM3算法加密流程(SM3加密算法一)

news2024/11/26 9:40:34

1、SM3 算法简介

  SM3是中国国家密码管理局发布的消息摘要算法,首次发布于2010年,并于2016年发布了正式的国家标准GB/T 32905-2016。类似于国际上广泛应用的SHA-256算法,但有其独特的设计和实现细节。

  该算法应用于各种数据加密和验证场景,比如电子支付、身份认证、数字签名等等。比如身份认证,用户在登录自己账号时,需要输入密码,能够将设置的密码存入服务器,然后与用户输入的密码进行对比,来判断密码正确性?

  显然不能,如果服务器被攻破,那么所有用户的账号和密码不就泄露了。用户设置的密码可以经过SM3加密,然后存入服务器中。后续用户登录时输入的密码在先经过SM3加密,然后与服务器中正确的加密结果对比,来判断密码是否正确。大致流程就是这样,实际情况肯定会比这个复杂。

  SM3算法的输入可以是任意长度数据,但加密结果始终是256位(32字节)数据。SM3 是基于Merkle-Damgård构造的,采用了定制的压缩函数与消息扩展算法,具体包括以下步骤:

  1、消息填充:将输入消息填充至长度为512位的倍数。

  2、消息扩展:对填充后的消息进行扩展,形成132个字。

  3、迭代压缩:将消息分块并逐块迭代压缩,最后输出256位的加密结果。

2、SM3算法术语

  后续计算过程中出现的所有字符和术语,都会在给小节讲解,过一遍即可,后续计算过程中出现疑问在回来看即可。

  内部数据在计算过程中都采用大端存储,先运算的数据放在高字节,后运算的数据放在低字节,如下图所示。

在这里插入图片描述

图1 大端存储

  1个字(word) == 4字节(byte) == 32位(bit)。

  下表是计算过程中会使用到的一些符号及其含义。

表1 运算过程中使用的符号
符号含义
ABCDEFGH分别代表输入的8位数据。
B(i)第i个消息分组。
CF压缩函数。
FFj布尔函数,随j变化取不同的表达式。
GGj布尔函数,随j变化取不同的表达式。
IV压缩函数的初始值。
P0压缩函数中的置换函数。
P1消息扩展中的置换函数。
Tj算法常量,随j的变化取不同的值。
m消息。
m’填充后的消息。
mod模运算。
n消息分组的个数。
^32比特与运算。
V32比特或运算。
¬32比特非运算。
+32比特算术加运算。
<<<K32比特循环左移K比特运算。
赋值运算,与=功能一致。

3、SM3算法描述

  SM3密码杂凑算法的输入为长度为L(L<2的64次方)比特的消息m,经过消息填充、消息扩展、迭代压缩过程后,输出长度为256比特的加密数据。

3.1、消息填充

  假设输入数据m的长度为L比特,则首先将比特“1”添加到输入数据m的末尾,再添加k比特“0”,k是满足L+1+k≡448(mod512)的最小非负整数。然后再添加一个64比特的数据,表示输入数据m的长度。填充后的消息m’的比特长度为512的倍数。

  例如:输入数据为01100001_01100010_01100011,长度L=24,填充后的数据为:

在这里插入图片描述

图2 填充后的数据

  如果输入24位数据为0x616263,则经过填充后的数据如下所示:

在这里插入图片描述

图3 输入0x616263填充后的数据

3.2、消息扩展

  将填充后的消息m’按512比特进行分组:m’=B(0) B(1) …B(n-1),其中n=(L+K+65)/512。如果输入数据长度小于447比特,则本次计算的m’就是B(0),否则m’会包含多个B(i)。

  在对m’进行迭代运算之前,需要先将消息分组B(i)按以下方法扩展生成132个消息字W0,W1,…W67 ,W’0,W’1,…W’63,用于后续的压缩计算。

  扩展过程如下所示,首先将前面消息填充得到的B(i)划分为16个字(1个字等于32比特)W0,W1,…W15。

  然后通过下面的公式计算W16,…W67。

在这里插入图片描述

图4 W(16)~W(67)的扩展公式

  P1是一个置换函数,表达式如下所示,P1的计算结果为输入信号X异或X循环左移15位,再异或X循环左移23位。

在这里插入图片描述

图5 置换函数表达式

  进而分析图4的公式,W(i-16)异或W(i-9)异或W(i-3)循环左移15位得到的结果作为P1(X)函数的输入数据,P1(X)的计算结果异或W(i-13)循环左移7位,最后异或W(i-6),得到W(i)的计算结果。

  例如需要计算W(16),则表达式为

  W(16) = P1(W(0) 异或 W(7)异或(W(13) <<< 7) ) 异或 (W(3) <<< 7) 异或 W(10)。由于异或的符号没有找到,因此使用文字替代,后续文章可能在多个平台发布,因此上标和下标直接用括号替代。

  通过以上运算,可以得到W(0)W(67),然后需要计算W’(0) W’(63),计算方式如下所示。

在这里插入图片描述

图6 W’(0)~ W’(63)的扩展方式

  上图公式里面的下标应该是打错了,应该都是i或者j,W’(i)是由W(i)异或W(i+4)得到的,计算很简单。

  上述计算得到的W0,W1,…W67 ,W’0,W’1,…W’63构成扩展后的B(i),就可以用于后续的迭代运算了。上文的输入数据0x616263经过消息填充、消息扩展后得到的132字节如下图所示:

在这里插入图片描述

图7 0x616263扩展结果

3.3、迭代压缩

  迭代压缩的函数如下所示,其中CF是压缩函数,V(0)是256位压缩函数初始值,B(i)是前面消息扩展后的数据,V(n)是迭代压缩的结果。

在这里插入图片描述

图8 迭代压缩函数

  压缩函数的计算过程如下所示,FOR循环中的部分需要计算64次,因此被称为迭代运算。

在这里插入图片描述

图9 迭代运算流程

  首先把迭代函数的初始值256比特V(i)赋值给8个32比特数据ABCDEFGH,其中V(0)为固定常数0x7380166f_4914b2b9_172442d7_da8a0600_a96f30bc_163138aa_e38dee4d_b0fb0e4e。

  64次迭代内容为上图蓝色框图部分,首先(A循环左移12位+E+(T(i)循环左移(j除以32的余数)),计算结果循环左移7位得到SS1。

  其中T(i)是一个常量,具体的数值如下所示,当i小于等于15时,值为0x79cc4519,否则值为0x7a879d8a。

在这里插入图片描述

图10 常量函数的计算

  A循环左移12位的结果异或SS1得到SS2。

  之后计算TT1,其中FFj(X,Y,Z)函数的表达式如下所示,当j小于16时,X异或Y异或Z得到计算结果,否则X,Y,Z两两进行与运算,结果再通过或运算,得到FFj(X,Y,Z)计算结果。

在这里插入图片描述

图11 FFJ布尔函数

  FFj(A,B,C)计算结果加上D,再加上SS2,最后加上W’(j)得到TT1。

  在TT2的计算过程中,有一个GGj(E,F,G)的函数,对应表达式如下。当J小于16时,运算过程与FFj(X,Y,Z)一致。当J大于等于16时,(X与Y)或(X取反后与上Z)得到结果。

在这里插入图片描述

图12 GGj布尔函数

  GGj(E,F,G)计算结果加上H,再加上SS1,最后加上W(j)得到TT2。注意再迭代过程中W’(j)只会用来计算TT1,而W(j)用来计算TT2,同时每次迭代只会用到对应的W(j)和W’(j),如果是在串行计算的过程中,则可以将前面的消息扩展和迭代运算同时进行流水线设计,从而加快计算过程,提高时钟频率。

  同时迭代过程并不会用到W(64)~ W(67)这几个数据,他们的作用在于生成W’(60)~ W’(63)这几个数据。

  然后中间是对A、B、C等数据的赋值过程,这部分比较简单,不再赘述。

  之后有一个P0(TT2)的函数,P0(X)对应的表达式如下所示,X异或(X循环左移9位)异或(X循环左移17位)得到计算结果。

在这里插入图片描述

图13 置换函数

  最终的ABCDEFGH作为本轮迭代的结果数据V(i+1),作为下一轮迭代的初始V(i)。

  经过64轮迭代后得到这组数据的迭代结果。如果有多组B(i),则将得到的迭代结果作为下一组数据迭代压缩过程的起始数据V(0)。

  上述整个加密过程,可以描述为下图,首先经过消息填充,把输入的任意比特数据分成很多的64字节消息组,然后每组数据通过消息扩展得到132字节数据,依次对每组数据进行迭代运算,得到最终的256比特输出结果。

在这里插入图片描述

图14 sm3加密概括

  上文中0x616263的部分迭代结果如下图所示:

在这里插入图片描述

图14 迭代中间值

  最终得到的结果如下所示:

在这里插入图片描述

图15 迭代结果

4、FPGA实现的思考

  在使用FPGA实现时,肯定是需要简化的,首先可以确定输入数据位宽,或者通过一个数据来指示当前输入数据的位宽,但是依旧需要确定输入数据最大位宽。

  为了简化计算,输入数据应小于等于477(512-65)比特,这样每次就只需要完成64轮迭代运算,可以快速得到结果。

在这里插入图片描述

图16 一次迭代完成加密的框图

  本文均参考与GB/T32905—2016,如果需要这个标准文档,在公众号后台回复“GB/T32905”(不包含引号)即可。


  如果对文章内容理解有疑惑或者对代码不理解,可以在评论区或者后台留言,看到后均会回复!

  如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!您的支持是我更新的最大动力!将持续更新工程!

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

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

相关文章

【NI国产替代】产线综测仪:锂电池保护板测试仪,支持快速定制

• 精度等级01% • 支持直流电压、电流、nA 级待机电流电阻等&#xff0c;常规测试 • 支持过压、欠压、过冲、过放、过温,短路等&#xff0c;保护测试 • 通讯总线电平可编程&#xff0c;兼容多种 • 支持 SWD 或IIC 固件烧录 • 测试速度快&#xff0c;支持最多 24 通道…

Windows关闭自动更新最有效的方法

按WR打开电脑命令框输入“regedit”进入注册表 依次点击以下几个 右击新建一个“DWORD(32位)值”&#xff0c;命名为”FlightSettingsMaxPauseDays“ 右边选择十进制&#xff0c;左边填写暂停更新的天数 打开windows更新&#xff0c;进入高级选项 选择暂停更新的天数&#xff…

数据库(27)——多表查询——自连接

语法 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...; 自连接可以是内连接查询也可以是外连接查询。 演示 我新增了字段friend便于演示 查询所有人的名字以及他们的friend的人的名字&#xff1a; select a.name,b.name from user a,user b where a.friendb.id; 其…

L48---1637. 两点之间不包含任何点的最宽垂直区域(排序)---Java版

1.题目描述 2.思路 &#xff08;1&#xff09;返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 我的理解是相邻两个点&#xff0c;按照等差数列那样&#xff0c;后一个数减去相邻的前一个数&#xff0c;才能保证两数之间不含其他数字。 &#xff08;2&#xff09;所以&…

kali2022安装教程(附安装包)

第一步&#xff1a;下载镜像文件 百度网盘下载https://pan.baidu.com/s/1efRQGFTbq6Kgw9axLOmWzg?pwdemxf 第二步&#xff1a;打开Vmware 第三步&#xff1a;进行各项配置 创建新的虚拟机&#xff0c;选择高级&#xff0c;然后下一步 直接默认下一步 选择稍后安装然后下…

CUDA 编程(1):使用Grid 和 Block分配线程

1 介绍 1.1 Grid 和 Block 概念 核函数以线程为单位进行计算的函数,cuda编程会涉及到大量的线程(thread),几千个到几万个thread同时并行计算,所有的thread其实都是在执行同一个核函数。 对于核函数(Kernel),一个核函数一般会分配1个Grid, 1个Grid又有很多个Block,1个Bloc…

IO流(缓冲流)

1.字节缓冲流 原理&#xff1a;字节缓冲输入流自带8KB缓冲池;字节缓冲输出流自带8KB缓冲池 public static void main(String[] args) throws IOException {try(InputStream is new FileInputStream("D:\\pt\\123.jpg");//1.定义一个字节缓冲输入流包装原始的字节输…

看似不同的事情,却是相同的坑

目录 一、背景二、过程1.遭遇战-微盘股的下杀2.不失为一件好事3.一切向后看吧&#xff0c;最近的学习感受4.该有的心境 三、总结 一、背景 也在一点点改变&#xff0c;期间势必要经历流血的过程&#xff1b;所谓无疯狂不成长&#xff0c;积极的心态去应对&#xff0c;去总结总…

数据分析常用模型合集(一)AARRR模型和漏斗模型

准备把常用的数据分析模型&#xff0c;像什么AARRR&#xff0c;RFM之类的&#xff0c;逐个全部写一下&#xff1b; 最好能带点案例和代码&#xff0c;搞一个小合集。 最终达到完全不懂的人&#xff0c;看完就能知道得差不多&#xff1b; 数据分析常用模型合集&#xff08;二…

中心极限定理的MATLAB例

独立同分布的中心极限定理&#xff1a; 设 X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1​,X2​,…,Xn​ 是独立同分布的随机变量序列&#xff0c;且 E ( X i ) μ E(X_i) \mu E(Xi​)μ&#xff0c; D ( X i ) σ 2 > 0 D(X_i) \sigma^2 > 0 D(Xi​)σ2>0&a…

再读高考作文题

新课标I卷&#xff1a;讨论了随着互联网和人工智能的普及&#xff0c;问题是否会变得越来越少&#xff0c;要求考生写一篇文章&#xff0c;表达自己对于这一现象的联想和思考。 从来就没有什么救世主 AI也不是​​​​​ 一直不会写作文&#xff0c;直到高中&#xff0c;才堪堪…

ssm604基于Java Web的怀旧唱片售卖系统+vue【已测试】

前言&#xff1a;&#x1f469;‍&#x1f4bb; 计算机行业的同仁们&#xff0c;大家好&#xff01;作为专注于Java领域多年的开发者&#xff0c;我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源&#xff1a; &#x1f469;‍&#x1f4bb; SpringBoot…

AI Agentic Design Patterns with AutoGen(上):顺序对话、代理反思

文章目录 一、多代理对话&#xff1a;单口喜剧1.1 Agent的基本功能1.2 多代理对话示例&#xff1a;单口喜剧1.2.1 创建Agent1.2.2 开始对话1.2.3 查看对话信息&#xff0c;自定义对话摘要1.2.4 设置对话终止条件 二、顺序对话&#xff1a;客户入职2.1 创建Agent2.2 构建顺序对话…

profile-3d-contrib,github三维立体图的使用

图片展示: 参考: https://zhuanlan.zhihu.com/p/681786778 原仓库链接&#xff1a; GitHub - yoshi389111/github-profile-3d-contrib: This GitHub Action creates a GitHub contribution calendar on a 3D profile image. 第一步 在你的个人仓库下找到Actions 第二步 点…

揭秘:币圈黑科技私钥碰撞器的项目教程玩法,外面竟然收费200+

一、前言&#xff1a;探寻币圈私钥探测器神秘面纱 在风华正茂的币圈&#xff0c;不仅有无数高涨或者暴跌的数字货币&#xff0c;更有许多被誉为“黑科技”的工具备受热议。其中&#xff0c;私钥碰撞器就是这些黑科技中的一员&#xff0c;它能够搜索并碰撞出特定地址的私钥&…

嘉立创面板制作不规则图案技巧

首先附上效果图展示&#xff1a; 所需软件&#xff1a;嘉立创EDA(专业版)、photoshop、Adobe Illustrator 嘉立创EDA(专业版)&#xff1a; 嘉立创面板绘制很容易上手&#xff0c;只要了解这几个图层的作用便可以做出自己想要的面板。 材料边界层&#xff1a; 代表选⽤的材料…

SpringAI的Transform入门

Transform转换 帮助将文档分割以适应 AI 模型的上下文窗口。 假如我们想要用 openai api 对一个段文本进行总结&#xff0c;我们通常的做法就是直接发给 api 让他总结。但是如果文本超过了 api 最大的 token 限制就会报错。这时&#xff0c;我们一般会进行对文章进行分段&#…

Linux线程安全:线程互斥

一、线程互斥的概念 1.1临界资源与互斥的关系 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。 临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。 互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入…

[书生·浦语大模型实战营]——LMDeploy 量化部署 LLM 实践

1.基础作业 1.1配置 LMDeploy 运行环境 创建开发机 创建新的开发机&#xff0c;选择镜像Cuda12.2-conda&#xff1b;选择10% A100*1GPU&#xff1b;点击“立即创建”。注意请不要选择Cuda11.7-conda的镜像&#xff0c;新版本的lmdeploy会出现兼容性问题。其他和之前一样&…

算法刷题【二分法】

题目&#xff1a; 注意题目中说明了数据时非递减的&#xff0c;那么这样就存在二分性&#xff0c;能够实现logn的复杂度。二分法每次只能取寻找特定的某一个值&#xff0c;所以我们要分别求左端点和有端点。 分析第一组用例得到结果如下: 成功找到左端点8 由此可知&#xff0…