SM3算法流程
注意:采用draw.io画的配图,插到博客园这里打开后真的好大,对不起各位看官。 ○| ̄|_
1. SM3简介
SM3算法也是一种哈希算法,中国国家密码管理局在2010年发布,其名称是SM3密码杂凑算法,密码管理局有该算法的详细说明,可以到其网站下载《GBT 32905-2016 信息安全技术 SM3密码杂凑算法》和《GMT 0004-2012 SM3密码杂凑算法》。
-
算法的本质给任意长度的数据()经过填充、迭代压缩后,生成固定长度的杂凑值,这个固定长度就是256比特。
-
处理过程:
- 第一步:填充。使填充后的数据的长度是512的整数倍。在数据的末尾上加一个1;然后把原始数据的长度用64比特表示,放在最后面;再看看现在的数据的长度值离512的整数还差多少个,差多少个就填多少个0在加的这个1和64比特的长度之间。
- 第二步:分组。把填充后的信息按照512比特一个分组进行分组。如果分成了n组,就是个分组。
- 第三步:迭代压缩。对每一个分组都进行消息扩展,再借助寄存器得到最后的杂凑值(哈希值)。迭代压缩这里有很多中间变量和寄存器的操作,具体还是看一下算法。

分组的目的是为了把填充后的消息能拆成512比特,在对每个512比特分别进行扩展和迭代压缩。
前一个分组的结果会参与下一个分组的迭代压缩计算。
经过一连串的迭代计算后,最终寄存器中的结果为SM3算法处理得到的杂凑值。
2. 相关符号和函数
2.1 一些符号定义
mod | 模运算 |
---|---|
32比特与运算 | |
32比特或运算 | |
32比特非运算 | |
32比特异或运算 (由于输入法打不出这个符号,因此下面的配图里用代替了) |
|
算数加运算 | |
循环左移k比特运算 | |
左向赋值运算符 |
2.2 一些固定值和函数
初始值:
常量:
布尔函数:
式中为字。
置换函数:
式中为字。
3. 算法流程
3.1 填充
假设消息的长度为l比特。
首先将比特“1”添加到消息的末尾,再添加k个"0",k是满足的最小非负整数。
然后再添加一个64位比特串,该比特串是长度的二进制表示。
填充后的消息的比特长度为512的倍数。

3.2 分组
将填充后的消息按512比特进行分组:

3.3 迭代压缩
3.3.1 消息扩展
将消息分组按以下方法扩展生成132个字。
每一个分组都需要扩展成这么多的字,每一个结果都会作为压缩函数的中间参数参与迭代计算。
a) 将消息分组划分为16个字;
b) FOR j=16 TO 67
ENDFOR
c) FOR j=0 TO 63
ENDFOR




3.3.2 压缩函数
令A,B,C,D,E,F,G,H为字寄存器,SS1, SS2, TT1, TT2为中间变量,压缩函数
计算过程如下:
FOR j=0 TO 63
ENDFOR
其中,字的存储为大端(big-endian)格式。


3.3.3 杂凑值结果
输出256比特的杂凑值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?