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

最靠谱的是看标准文档!

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长度:

相关推荐
yaoh.wang1 小时前
力扣(LeetCode) 13: 罗马数字转整数 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
T1ssy2 小时前
布隆过滤器:用概率换空间的奇妙数据结构
算法·哈希算法
hetao17338372 小时前
2025-12-12~14 hetao1733837的刷题笔记
数据结构·c++·笔记·算法
鲨莎分不晴3 小时前
强化学习第五课 —— A2C & A3C:并行化是如何杀死经验回放
网络·算法·机器学习
搞科研的小刘选手4 小时前
【ISSN/ISBN双刊号】第三届电力电子与人工智能国际学术会议(PEAI 2026)
图像处理·人工智能·算法·电力电子·学术会议
拉姆哥的小屋4 小时前
从混沌到秩序:条件扩散模型在图像转换中的哲学与技术革命
人工智能·算法·机器学习
Sammyyyyy4 小时前
DeepSeek v3.2 正式发布,对标 GPT-5
开发语言·人工智能·gpt·算法·servbay
sin_hielo5 小时前
leetcode 2110
数据结构·算法·leetcode
Jay20021115 小时前
【机器学习】33 强化学习 - 连续状态空间(DQN算法)
人工智能·算法·机器学习
panzer_maus5 小时前
归并排序的简单介绍
java·数据结构·算法