安全密码算法:SM3哈希算法介绍

news2024/9/22 19:36:05

最靠谱的是看标准文档!

1. 简介

国密算法之一,哈希算法的一种,也是密码杂凑算法。可以将不定长的输入消息message,经过SM3算法计算后输出为32B固定长度的哈希值(hash value)。哈希算法的实质是单向散列函数(one-way hash function),其特点是,输入数据有1bit的改变都有很大概率会产生不同的散列值,因而很多场景中会使用散列值来验证输入消息的完整性。

2. 应用场景

哈希算法的应用场景很多,可以用在国密SM2签名验签过程中的hash计算,可以用于HMAC消息认证码生成过程,可以用以证明输入的消息是否被篡改过(比如说可以验证网站下载的软件是否被修改过),还可以作为伪随机数使用。

3. 算法步骤

3.1    简述
对长度为L(L< 2^64) 比特的消息m, SM3杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特。
3.2    填充
先对L长度的消息最后面填充1,再在后面填充k(=448-1-L)个0,再在0后面填充64位比特串,这个比特串是L的二进制数。所以填充之后的值,是一个512(L + 1 + 448 – 1 – L + 64)长度的比特串。
比如,对消息01100001 01100010 01100011,其长度L=24,经填充得到比特串:01100001 01100010 01100011 1 00 · · · 00(423=448-1-24个0)00…0001 1000(64个)
3.3    迭代压缩
将填充后的消息m′按512比特进行分组:(打上标不好打,直接截图了,以下涉及到上标的都截图吧..)
其中n=(l+k+65)/512。比如上面的k=423,l = 24,所以n=1。
对m′按下列方式迭代:
FOR i=0 TO n-1

ENDFOR
其中CF是压缩函数,为256比特初始值IV,为填充后的消息分组,迭代压缩的结果 ,其中IV= 7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e。
消息分组后的每组(512B)都要走一下CF压缩函数。这个压缩函数是怎么计算的呢?

3.4 压缩函数CF

      令A,B,C,D,E,F,G,H为字寄存器(每个为4B,是已知的),SS1, SS2, TT1, TT2为中间变量,压缩函数。计算过程描述如下:

压缩之后的数据就成了32B的数据了,即。中间有个参数是需要另外一个步骤:消息扩展得到的。

3.5 消息扩展

3.6 哈希值

至此哈希值可通过上述步骤得到。需要注意的一点是,根据步骤ABCDEFGH初始值就是IV。还有迭代压缩中涉及到的布尔函数和置换函数以及常量Tj如下:

4. Openssl 代码实现(可提取SM3算法接口)

sm3的openssl源码在demo目录可以提取:

同时在digest文件夹下面可以单独编译测试demo文件,非常方便。

虽然test case:EVP_MD_demo中使用的实例是SHA3-512,但是,也可以换成sm3。因为至少是可支持以下这些digest的:

5. openssl 命令行实现

6. openssl上sm3的性能

openssl speed -evp sm3 -bytes 1000000000测试了1G数据sm3在CPU上的性能

自研硬件的性能大概在1.853GB/s(应该能更高些)

7. 关键参数和边界条件

唯一的输入是消息message,消息长度的上限是2^64,所以测试的长度范围为小于 2^64,包括0长度:

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

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

相关文章

Java | Leetcode Java题解之第343题整数拆分

题目&#xff1a; 题解&#xff1a; class Solution {public int integerBreak(int n) {if (n < 3) {return n - 1;}int quotient n / 3;int remainder n % 3;if (remainder 0) {return (int) Math.pow(3, quotient);} else if (remainder 1) {return (int) Math.pow(3…

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数&#xff0c;该函数接受三个参数&#xff1a;输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…

[Linux][OS][详解信号的产生]

目录 1.信号概念 硬件层面 2. 产生! 1. 键盘组合键 2. kill 命令 kill -signo pid 3. 系统调用 4. 硬件异常--会自动退出 软件条件--闹钟 发送 信号和信号量没有任何的关系&#xff0c;就像老婆和老婆饼&#xff0c;上一篇文章我们讲到了信号量&#xff0c;这篇文章我…

探索未来教育新形态:基于AI大模型的在线辅导平台LlamaTutor

在数字化时代,教育的边界正在被重新定义。今天,我们将深入探索一款创新的教育工具——LlamaTutor,一个基于AI大模型的在线个人辅导平台,它利用前沿技术为学习者带来前所未有的个性化学习体验。 引言 随着人工智能技术的飞速发展,AI在教育领域的应用日益广泛。LlamaTutor…

冰岛数据中心技术三巨头推出由可再生能源驱动的一体化云计算解决方案

冰岛通过国内生产的各种形式的可再生能源来满足其大部分能源需求。据三家开发新数据中心服务的公司称&#xff0c;这个北欧岛国也是关键任务云应用的理想环境。 Vespertec 公司、Sardina Systems 公司和 Borealis 公司共同开发了一种创新的 IT 解决方案&#xff0c;名为冰云综合…

MATLAB算法实战应用案例精讲-【人工智能】差分隐私(概念篇)

目录 前言 知识储备 算法原理 发展历程 差分隐私的引入 GIC 事件 ε(epsilon)-差分隐私​编辑 实现方式 什么是差分隐私 差分隐私的工作原理 数学模型 差分隐私计算公式 拉普拉斯机制 高斯机制 高斯机制满足 (ε,δ)-差分隐私的数学证明 可组合性 怎样在机…

Python版《超级玛丽+源码》-Python制作超级玛丽游戏

小时候最喜欢玩的小游戏就是超级玛丽了&#xff0c;有刺激有又技巧&#xff0c;通关真的很难&#xff0c;救下小公主还被抓走了&#xff0c;唉&#xff0c;心累&#xff0c;最后还是硬着头皮继续闯&#xff0c;终于要通关了&#xff0c;之后再玩还是没有那么容易&#xff0c;哈…

思科OSPF动态路由配置8

#路由协议实现# #任务八OSPF动态路由配置8# 开放式最短路径优先&#xff08;Open Shortest Path First,OSPF&#xff09;协议是目前网络中应用最广泛的动态路由协议之一。它也属于内部网关路由协议&#xff0c;能够适应各种规模的网络环境&#xff0c;是典型的链路状态路由协…

JavaScript初级——简介

一、什么是语言 1、计算机就是一个由人来控制的机器。 2、我们要学习的语言就是人和计算机交流的工具&#xff0c;人类通过语言来控制、操作计算机。 3、编程语言和我们说的中文、英文本质上没有区别&#xff0c;只是语法比较特殊。 4、语言的发展&#xff1a; —纸带机&#x…

“低代码” 风暴:重塑软件开发新未来

目录 引言&#xff1a; 正文&#xff1a; 方向一&#xff1a;技术概览 方向二&#xff1a;效率与质量的权衡 方向三&#xff1a;挑战与机遇 结束语&#xff1a; 引言&#xff1a; 在当今数字化高速发展的时代&#xff0c;技术的创新如同璀璨星辰不断照亮我们前行的道路。“…

Dijikstra算法(堆优化版)

当给定数据的范围不大时&#xff0c;采用朴素Dijikstra算法尚能ac&#xff0c;但若是数据范围大于10^5&#xff0c;那么朴素Dijikstra算法就会爆掉&#xff0c;所以我们需要采用堆优化版的Dijikstra算法 堆优化版Dijikstra主要是对朴素Dijikstra中找寻从距离编号 1 结点路径长…

突然肾结石了:这时候我才意识到问题

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 中午吃过饭&#xff0c;下腹剧痛&#xff0c;忍了2个小时&#xff0c;我以为是普通肚子痛&#xff0c;因为之前没有任何征兆&#xff0c;所以我忍痛拍了这个视频。 这也是为什么评论区有朋友说&#xff1a;这期视频…

BQ27441初始化配置程序,电压、SOC等参数读取程序

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、模拟IIC二、BQ27441初始化配置程序三、学习资料 前言 送给大学毕业后找不到奋斗方向的你&#xff08;每周不定…

算法打卡 Day23(二叉树)-二叉搜索树的最小绝对差 + 二叉搜索树中的众数 + 二叉树的最近公共祖先

文章目录 Leetcode 530-二叉搜索树的最小绝对差题目描述解题思路 Leetcode 501-二叉搜索树中的众数题目描述解题思路 Leetcode 236-二叉树的最近公共祖先题目描述解题思路 Leetcode 530-二叉搜索树的最小绝对差 题目描述 https://leetcode.cn/problems/minimum-absolute-diff…

萌啦数据使用多久,萌啦数据价格表2024

在数字化浪潮汹涌的今天&#xff0c;数据已成为企业决策与业务增长的核心驱动力。在众多数据分析工具中&#xff0c;萌啦数据凭借其强大的数据处理能力、直观的数据可视化效果以及灵活的数据分析模型&#xff0c;赢得了众多企业和个人的青睐。那么&#xff0c;关于“萌啦数据使…

C++ | Leetcode C++题解之第341题扁平化嵌套列表迭代器

题目&#xff1a; 题解&#xff1a; class NestedIterator { private:vector<int> vals;vector<int>::iterator cur;void dfs(const vector<NestedInteger> &nestedList) {for (auto &nest : nestedList) {if (nest.isInteger()) {vals.push_back(n…

苍穹外卖项目DAY05

苍穹外卖项目DAY05 1、店铺营业状态设置 1.1、Redis入门 Redis简介 Redis是一个基于内存的key-value结构数据库 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热点商品、咨询、新闻&#xff09;企业应用广泛 中文网&#xff1a;https://www.redis.net…

FSOP,glibc-2.23攻击IO_list_all

文章目录 FSOP介绍&#xff1a;FOSP链执行流程&#xff1a;源码调试过程 FSOP 介绍&#xff1a; FSOP 是 File Stream Oriented Programming 的缩写&#xff0c;根据前面对 FILE 的介绍得知进程内所有的 _ IO_FILE 结构会使用 _ chain 域相互连接形成一个链表&#xff0c;这个…

景联文科技:一文详解如何构建高质量SFT数据

在图像处理和计算机视觉领域中&#xff0c;将一张图像转化为可用于训练机器学习模型的数据是一项复杂而重要的任务。SFT&#xff08;Supervised Fine-Tuning&#xff0c;监督微调&#xff09;是一种常见的深度学习策略&#xff0c;在这一过程中发挥着核心作用。 SFT是指在一个预…

【云备份】服务端模块-热点管理

文章目录 0.回顾extern1.介绍2.实现思想3.代码测试代码 0.回顾extern extern cloudBackup::DataManager *_dataManager extern 关键字用于声明一个全局变量或对象&#xff0c;而不定义它。这意味着 _dataManager 是一个指向 cloudBackup::DataManager 类型的指针&#xff0c;但…