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

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”(不包含引号)即可。


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vs - vs2015编译gtest-v1.12.1

文章目录 vs - vs2015编译gtest-v1.12.1概述点评笔记将工程迁出到本地后&#xff0c;如果已经编译过工程&#xff0c;将工程Revert, Clean up 干净。编译用的CMake, 优先用VS2019自带的打开VS2015X64本地命令行编译gtest工程测试安装自己写个测试工程&#xff0c;看看编译出来的…

使用小黄鸟(HttpCanary)、VMOS Pro虚拟机对手机APP进行抓包(附带软件)

老规矩先看&#xff0c;效果图&#xff1a; 文章很详细&#xff0c;希望可以耐心看完&#xff0c;保证可以学会抓包&#xff0c;不再走冤枉路&#xff0c;小编在之前看过太多类似文章&#xff0c;折腾了太久才搞懂的&#xff0c;写这篇文章就是不想希望你们像小编一样再花时间…

谁也没想到来得如此之快,现在二三线城市就有电梯楼变成贫民窟了

独家首发 ----------------- 高层电梯楼贫民窟化&#xff0c;一直是业界担忧的问题&#xff0c;许多人以为这个问题应该还要十多年时间才会成为现实&#xff0c;然而有网友表示在二三线城市已出现高层电梯楼贫民窟化&#xff0c;时间比大家预期的早得多。 该网友说&#xff0c;…

easyexcel将csv转为excel处理数字问题

使用easyexcel可以将csv格式的文件转为.xlsx文件&#xff0c;但是csv中有很多数字&#xff0c;比如&#xff1a;"123","12.34","-111"&#xff0c;默认情况下会将其作为字符串写入.xlsx文件&#xff0c;就如同下面一样&#xff0c;字符类型的数字…

Nginx学习笔记(九)location转发后,proxy_pass结尾带 / 和不带 / 的区别

目录 一、知识回顾二、proxy_pass 结尾带 / 和不带 / 的区别2.1 场景假设2.2 实战验证验证1&#xff1a;结尾带/的场景验证2&#xff1a;不带/的场景 2.3 结论 一、知识回顾 之前使用过 Nginx 的小伙伴或许都了解&#xff0c;Nginx 是一款用于请求转发的高性能中间件&#xff…

【数据结构(邓俊辉)学习笔记】图03——拓扑排序

文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述 学习下拓扑排序 1. 零入度算法 1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事&#xff0c;如编讲义&#xff0c;将已经知道的知识点串起来变成讲课序列。那…

Vivado时序报告之Datasheet详解

目录 一、前言 二、Datasheet配置选项说明 2.1 Options 2.2 Groups 2.3 Timer Settings 2.4 Common Options 三、Datasheet报告 3.1 General Information 3.2 Input Ports Setup/Hold 3.3 Output Ports Clock-to-out 3.4 Setup between Clocks 3.5 Combinational…

盘点 2024 Google I/O 中的 Android 方向关键更新

这里写自定义目录标题 前言1. AI 编程助手2. 生成式AI 应用3. 不同屏幕尺寸适配4. 桌面小部件&#xff08;Widget&#xff09;5. 跨设备类型开发6. WearOS & 可穿戴7. Android for Car8. Android TV9. Google Home API10. Kotlin Multiplatform11. Jetpack Compose12. Andr…

HTML+CSS+JS 密码灯登录表单

效果演示 实现了一个登录页面,包括一个标题、两个输入框(用户名和密码)、一个登录按钮和一个眼睛图标。点击眼睛图标可以显示或隐藏密码。页面背景有两个圆形的半透明元素,整个页面使用了flex布局,并且在水平和垂直方向上都居中对齐。登录框使用了阴影效果和圆角边框,并且…

Jmeter 压力测测试的简单入门

下载安装 官方网站&#xff1a;Apache JMeter - Download Apache JMeter 下载完成解压即可。 配置 1. 找到 bin 目录下的 ApacheJMeter.jar 包&#xff0c;直接打开 如果向图片这样不能直接打开&#xff0c;就在此路径运行 CMD&#xff0c;然后输入下面的命令即可启动。 ja…

微信小程序学习笔记(4)

文章目录 1、< template >< / template >2、样式导入i、wxmlii、wxss 3、flex布局i、容器属性ii、项目属性 1、< template >< / template > 模板可以重复调用 首先要定义一个模板&#xff1a; <template name"test"><view>{{…

Python GUI编程:深入探索现代GUI库及其创新应用

目录 引言 Python GUI库概览 1. Tkinter 2. PyQt/PySide 3. wxPython 4. Kivy 5. PyGTK 6.FLTK (pyFLTK) 创新应用案例 1. 交互式数据分析工具 2. 智能物联网(IoT)仪表板 3. 增强现实(AR)辅助设计软件 4. 跨平台的科学计算软件 5. 交互式教育软件 实战示例1&…

Springboot整合SpringCache+redis简化缓存开发

使用步骤&#xff1a; 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupI…

MySQL—多表查询—标量子查询

一、引言 上篇学习完子查询的概念和分类。 现在来学习第一种子查询——标量子查询。 &#xff08;1&#xff09;标量子查询的基本概念 子查询返回的结果是单个值&#xff0c;也就是一行一列&#xff08;可以是数字、字符串、日期等&#xff09; 是一种最简单的子查询形式&am…

【机器人和人工智能——自主巡航赛项】进阶篇

文章目录 案例要求创建地图rviz仿真 保存地图坐标点定位识别训练主逻辑理解语音播报模块匹配二维码识别多点导航讲解视频其余篇章 案例要求 创建地图 ./1-gmapping.sh 把多个launch文件融合在sh文件里面 rviz仿真 rviz是rose集成的可视化界面&#xff0c;查看机器人的各项数…

iOS--block再学习

block再学习 什么是blockblock是带有自动变量的匿名函数block语法 block的实现block的实质截获自动变量__blcok说明符Block存储域__block变量存储域使用__block变量用结构体成员变量__forwarding的原因 截获对象 什么是block Block时c语言的扩充功能&#xff0c;它允许开发者定…

宝塔面板和 LNMP 环境下反代 HFish 蜜罐平台的正确方法

最近明月在热心站长好友的支持下搭建了安全、简单、有效并永久免费的蜜罐平台 HFish,因为 HFish 默认是以 https://IP:端口 的 Web 链接形式提供访问的,这会暴露蜜罐平台的真实服务器 IP 不说,还非常不便于快速的访问(反正明月是记不住 IP 的),所以就需要给部署好的 HFis…

Python爬取与可视化-豆瓣电影数据

引言 在数据科学的学习过程中&#xff0c;数据获取与数据可视化是两项重要的技能。本文将展示如何通过Python爬取豆瓣电影Top250的电影数据&#xff0c;并将这些数据存储到数据库中&#xff0c;随后进行数据分析和可视化展示。这个项目涵盖了从数据抓取、存储到数据可视化的整个…

《精通ChatGPT:从入门到大师的Prompt指南》第4章:避免常见错误

第4章&#xff1a;避免常见错误 在使用ChatGPT进行Prompt编写时&#xff0c;常见的错误可能会大大影响生成内容的质量和准确性。本章将详细讨论这些错误&#xff0c;并提供如何避免它们的建议。 4.1 不明确的指令 在使用ChatGPT时&#xff0c;一个常见的问题是指令不够明确。…

中电联系列二:rocket手把手教你理解中电联协议!

分享《一套免费开源充电桩物联网系统&#xff0c;是可以立马拿去商用的&#xff01;》 前 言 T/CEC102《电动汽车充换电服务信息交换》分为四个部分&#xff1a; ——第1部分&#xff1a;总则&#xff1b; ——第2部分&#xff1a;公共信息交换规范&#xff1b; ——第3部分&a…