【SM3哈希算法】算法原理
参考:
文章目录
- 【SM3哈希算法】算法原理
- 一、算法简介
- 二、基本原理
- 三、具体流程
- 1、填充
- 2、分组
- 3、迭代压缩
- C语言实现
一、算法简介
SM3算法是一种密码散列函数标准,由国家密码管理局发布。它的安全性和SHA-256相当,适用于商用密码应用中的数字签名和验证、消息认证码生成和验证、随机数生成等。
二、基本原理
将输入的消息分成512位的分组,并对每个分组进行填充、分组、扩展、迭代压缩等操作,最后输出256位的摘要值。这里给大家展示一个之前密码学课程设计,通过调用java已有的密码学库实现的SM3哈希值计算:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TmZ2BVSN-1686183884493)(null)]
输入:
Hello World!
输出:
0AC0A9FEF0D212AA76A3C431F793853CE145659CA1D14B114E96C1215CF26582
三、具体流程
1、填充
此处我们记输入的消息为m,假设m的长度为l比特,填充后得到的消息为m‘。因为我们输入的消息内容长度不是固定的,但是为了后续能够运算,需要将消息m填充为512倍数的消息m’。
填充步骤:
-
先将1比特添加到消息的末尾
-
通过公式
l + 1 + k ≡ 448 m o d 512 l + 1 + k ≡ 448 mod 512 l+1+k≡448mod512
计算得出最小的非负整数k,然后再添加k个0
补充:448=512-64,448是因为最后需要添加l的64比特长度二进制表示,详见下一步。 -
最后,再添加一个64位比特串,比特串的内容是m的长度 ‘l’ 的二进制表示
Example:
输入的消息 m:01100001 01100010 01100011
输入m的长度: l = 24
计算出来的k: l+1+k≡24+1+423≡448 mod 512----->k=423
填充后:
2、分组
分组这一步,就是简单的将上一步填充得到的消息m‘,由于填充后,m’的长度为512的倍数,因此分组只需将m‘分为512位长度的n (n=(l+k+64)/512) 个小组即可。(||表示拼接)
m
’
=
B
(
0
)
∣
∣
B
(
1
)
∣
∣
⋅
⋅
⋅
∣
∣
B
(
n
−
1
)
m’ = B(0)||B(1)||···||B(n-1)
m’=B(0)∣∣B(1)∣∣⋅⋅⋅∣∣B(n−1)
3、迭代压缩
针对每个分组的内容,进行n轮迭代运算,所得结果V(n)即为最终的哈希值。
-
迭代原理:
for i=0 to n-1 v(i+1)=CF(V(i), B(i)) endfor
CF():压缩函数
B(i):填充后的消息分组
V(n):最终结果
V(0):256比特的初始值IV,IV的初始值已提前规定
V(0)=IV=7380166f 4914b2b9 172442d7 da8a0600 a96130bc 163138aa E38dee4d b0fb0e4e
-
符号定义:
在详细讲解压缩函数之前,需要先看一些参考文献中的符号:
P 0 ( X ) = X ⊕ ( X < < < 9 ) ⊕ ( X < < < 17 ) , P0(X)=X⊕(X<<<9)⊕(X<<<17), P0(X)=X⊕(X<<<9)⊕(X<<<17),P 1 ( X ) = X ⊕ ( X < < < 15 ) ⊕ ( X < < < 23 ) . P1 (X)=X⊕(X<<<15)⊕(X<<<23). P1(X)=X⊕(X<<<15)⊕(X<<<23).
其中 ’<<<k‘ 表示的是32比特(1word)循环左移k比特运算
-
压缩函数:
C F ( V , B ) CF(V,B) CF(V,B)
其中V为256比特256/32=8个字的长度,每个字分别用ABCDEFGH寄存器存储 我们之前所分组生成的B为512字节,也就是16个字的长度,但是由于压缩函数中需要用到更长的B,因此此处对B进行一个扩展操作,将其扩展为132个字
-
扩展操作:
将消息分组B(i)划分为16个字W0…W15,然后接下来的W16到W67,由以下公式循环计算获得:W‘0到W’63由以下公式循环计算获得:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDqwqwb1-1686183881087)(file:///C:/Users/12235/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png)]
因此,最后获得扩展后的消息长度为68+64=132个字
Example:
当j=16
-
压缩函数:
令ABCDEFGH为字寄存器,SS1,SS2,TT1,TT2为中间变量
-
C语言实现
后续更新~