SM3算法流程

注意:采用draw.io画的配图,插到博客园这里打开后真的好大,对不起各位看官。 ○| ̄|_

1. SM3简介

SM3算法也是一种哈希算法,中国国家密码管理局在2010年发布,其名称是SM3密码杂凑算法,密码管理局有该算法的详细说明,可以到其网站下载《GBT 32905-2016 信息安全技术 SM3密码杂凑算法》和《GMT 0004-2012 SM3密码杂凑算法》。

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

  2. 处理过程:

    • 第一步:填充。使填充后的数据的长度是512的整数倍。在数据的末尾上加一个1;然后把原始数据的长度用64比特表示,放在最后面;再看看现在的数据的长度值离512的整数还差多少个,差多少个就填多少个0在加的这个1和64比特的长度之间。
    • 第二步:分组。把填充后的信息按照512比特一个分组进行分组。如果分成了n组,就是B0,B1,,Bn1个分组。
    • 第三步:迭代压缩。对每一个分组都进行消息扩展,再借助寄存器得到最后的杂凑值(哈希值)。迭代压缩这里有很多中间变量和寄存器的操作,具体还是看一下算法。

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

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

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

2. 相关符号和函数

2.1 一些符号定义

mod 模运算
32比特与运算
32比特或运算
¬ 32比特非运算
32比特异或运算
(由于输入法打不出这个符号,因此下面的配图里用xor代替了)
+ mod223算数加运算
k 循环左移k比特运算
左向赋值运算符

2.2 一些固定值和函数

初始值:

IV=7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e


常量:

Tj={79cc45190j157a879d8a16j63


布尔函数:

FFj(X,Y,Z)={XYZ0j15(XY)(XZ)(YZ)16j63

GGj(X,Y,Z)={XYZ0j15(XY)(¬XZ)16j63

式中X,Y,Z为字。


置换函数:

P0(X)=X(X9)(X17)

P1(X)=X(X15)(X23)

式中X为字。

3. 算法流程

3.1 填充

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

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

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

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

3.2 分组

将填充后的消息m按512比特进行分组:m=B0B1Bn1,n=(l+k+65)/512

3.3 迭代压缩

3.3.1 消息扩展

将消息分组Bi按以下方法扩展生成132个字W0,W1,,W67,W0,W1,W63

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

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

b) FOR j=16 TO 67

WjP1(Wj16Wj9(Wj315))(Wj137)Wj6

ENDFOR

c) FOR j=0 TO 63

Wj=WjWj+4

ENDFOR





3.3.2 压缩函数

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

计算过程如下:

ABCDEFGHV(i)

FOR j=0 TO 63

SS1((A12)+E+(Tjj))7

SS2SS1(A12)

TT1FFj(A,B,C)+D+SS2+Wj

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

DC

CB9

BA

ATT1

HG

GF19

FE

EP0(TT2)

ENDFOR

Vi+1ABCDEFGHV(i)

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


3.3.3 杂凑值结果

ABCDEFGHV(n)

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




posted @   书书书书君  阅读(4992)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示