news 2026/9/14 16:01:58

sm3加密算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
sm3加密算法

Sm3加密算法

SM3是中国国家密码管理局2010年发布的商用密码杂凑算法标准,生成256位固定长度的哈希值,适用于数字签名、消息认证、密码存储等场景。其设计基于Merkle-Damgård结构,安全性等效于国际SHA-256算法,但采用定制化的压缩函数增强抗攻击能力。

二、核心流程
  1. 消息填充将输入补足至512位倍数(补1+0...0+64位消息长度)
  2. 消息扩展将512位分组扩展为132个32位字
  3. 迭代压缩通过64轮压缩函数更新8个寄存器状态

结果生成最终寄存器组合输出256位哈希值

算法的本质给任意长度的数据(l≤264)经过填充、迭代压缩后,生成固定长度的杂凑值,这个固定长度就是256比特

处理过程:

第一步:填充。使填充后的数据的长度是512的整数倍。在数据的末尾上加一个1;然后把原始数据的长度用64比特表示,放在最后面;再看看现在的数据的长度值离512的整数还差多少个,差多少个就填多少个0在加的这个1和64比特的长度之间。

第二步:分组。把填充后的信息按照512比特一个分组进行分组。如果分成了n组,就是B0,B1,…,Bn−1个分组。

第三步:迭代压缩。对每一个分组都进行消息扩展,再借助寄存器得到最后的杂凑值(哈希值)。迭代压缩这里有很多中间变量和寄存器的操作,具体还是看一下算法。

分组的目的是为了把填充后的消息m′能拆成512比特,在对每个512比特分别进行扩展和迭代压缩。

前一个分组的结果会参与下一个分组的迭代压缩计算。

经过一连串的迭代计算后,最终寄存器中的结果为SM3算法处理得到的杂凑值。

2. 相关符号和函数

2.1 一些符号定义

mod

模运算

32比特与运算

32比特或运算

¬

32比特非运算

32比特异或运算
(由于输入法打不出这个符号,因此下面的配图里用xor代替了)

+

mod223算数加运算

⋘k

循环左移k比特运算

左向赋值运算符

2.2 一些固定值和函数

初始值:

IV=7380166f4914b2b9172442d7da8a0600a96f30bc163138aae38dee4d b0fb0e4e

常量:

Tj={79cc45190≤j≤157a879d8a16≤j≤63

布尔函数:

FFj(X,Y,Z)={X⊕Y⊕Z0≤j≤15(X∧Y)∨(X∧Z)∨(Y∧Z)16≤j≤63

GGj(X,Y,Z)={X⊕Y⊕Z0≤j≤15(X∧Y)∨(¬X∧Z)16≤j≤63

式中X,Y,Z为字。

置换函数:

P0(X)=X⊕(X⋘9)⊕(X⋘17)

P1(X)=X⊕(X⋘15)⊕(X⋘23)

式中X为字。

3. 算法流程

3.1 填充

假设消息m的长度为l比特。

首先将比特“1”添加到消息的末尾,再添加k个"0",k是满足l+1+k≡448mod512的最小非负整数。

然后再添加一个64位比特串,该比特串是长度l的二进制表示。

填充后的消息m′的比特长度为512的倍数。

3.2 分组

将填充后的消息m′按512比特进行分组:m′=B0B1…Bn−1,n=(l+k+65)/512

3.3 迭代压缩

3.3.1 消息扩展

将消息分组Bi按以下方法扩展生成132个字W0,W1,…,W67,W′0,W′1,⋯,W′63。

每一个分组Bi都需要扩展成这么多的字,每一个结果都会作为压缩函数的中间参数参与迭代计算。

a) 将消息分组Bi划分为16个字W0,W1,…,W15;

b) FOR j=16 TO 67

​ Wj←P1(Wj−16⊕Wj−9⊕(Wj−3⋘15))⊕(Wj−13⋘7)⊕Wj−6

ENDFOR

c) FOR j=0 TO 63

​ W′j=Wj⊕Wj+4

ENDFOR

3.3.2 压缩函数

令A,B,C,D,E,F,G,H为字寄存器,SS1, SS2, TT1, TT2为中间变量,压缩函数Vi+1=CF(V(i),B(i)),0≤i≤n−1

计算过程如下:

ABCDEFGH←V(i)

FOR j=0 TO 63

​ SS1←((A⋘12)+E+(Tj⋘j))⋘7

​ SS2←SS1⊕(A⋘12)

​ TT1←FFj(A,B,C)+D+SS2+W′j

​ TT2←(E,F,G)+H+SS1+Wj

​ D←C

​ C←B⋘9

​ B←A

​ A←TT1

​ H←G

​ G←F⋘19

​ F←E

​ E←P0(TT2)

ENDFOR

Vi+1←ABCDEFGH⊕V(i)

其中,字的存储为大端(big-endian)格式。

3.3.3 杂凑值结果

ABCDEFGH←V(n)

输出256比特的杂凑值y=ABCDEFGH。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 1:46:50

告别深夜批改:用Qwen3-VL大模型打造会“理解”的作文阅卷助手

深夜十一点,李老师揉了揉发酸的眼睛,面前还有三十多篇作文等待批改。 这是无数语文教师的日常写照——繁重的批改负担、难以完全统一的标准、反馈到达学生手中时已失去时效性。 而在AI技术日新月异的今天,我们能否让机器真正“理解”一篇作…

作者头像 李华
网站建设 2026/9/14 0:59:01

LobeChat语音输入功能实测:让AI对话更自然流畅

LobeChat语音输入功能实测:让AI对话更自然流畅 在移动办公、车载交互和无障碍场景日益普及的今天,用户对AI助手的期待早已不止于“能答”,而是“听得懂、反应快、用得顺”。键盘敲字虽然精准,但面对做饭时腾不出手查菜谱、开车途中…

作者头像 李华
网站建设 2026/9/13 18:55:16

基于PaddlePaddle的视觉模型训练实战:从Docker安装到GPU算力调用

基于PaddlePaddle的视觉模型训练实战:从Docker安装到GPU算力调用 在AI项目落地过程中,最让人头疼的往往不是算法本身,而是“环境装不上”、“在我机器上明明能跑”这类问题。尤其是涉及深度学习视觉任务时,Python版本、CUDA驱动、…

作者头像 李华
网站建设 2026/9/12 17:31:27

LobeChat能否实现多轮对话优化?上下文理解增强策略

LobeChat的多轮对话优化实践:上下文理解如何真正落地? 在今天,一个聊天机器人“听懂”用户说了什么,已经不再稀有。但真正考验其智能水平的,是它能否记住你之前说过的话——比如你在三轮对话前提到的偏好、设定的角色…

作者头像 李华
网站建设 2026/9/13 13:22:07

如何在Windows和Linux上完成TensorRT安装包的部署

如何在Windows和Linux上完成TensorRT安装包的部署 在AI模型从实验室走向生产环境的过程中,推理效率往往成为决定系统能否落地的关键瓶颈。一个在训练时表现优异的模型,如果在服务端响应迟缓、吞吐低下,就难以支撑真实业务场景的需求。尤其是…

作者头像 李华
网站建设 2026/9/14 4:34:07

Dify在边缘计算场景下部署的可行性评估

Dify在边缘计算场景下部署的可行性评估 在智能制造车间,一位维修工程师正对着一台故障设备束手无策。他拿起手持终端,用语音提问:“XX型伺服电机报过热警报,可能原因有哪些?”不到两秒,本地AI助手便返回了结…

作者头像 李华