了解一下SM3。
SM3哈希算法
定义
哈希值
长度256比特,32字节
字
32比特,4字节长度
符号
$$
A,B,C,D,E,F,G,H
$$
8个字宽的寄存器
$$
B^{(i)}
$$
第i
个消息分组
$$
CF
$$Compress Function
,压缩函数
$$
FF_j
$$
布尔函数,随j
而取不同表达式
$$
GG_j
$$
布尔函数,随j
而取不同表达式
$$
IV
$$Initial Value
,初始值,用于确定压缩函数寄存器的初态
$$
P_0
$$
压缩函数中的置换函数
$$
P_1
$$
消息拓展中的置换函数
$$
T_j
$$
常量,根据j
变化
$$
m
$$
消息
$$
m’
$$
填充后的消息
常数
部分定义直接写Python函数了,懒得写Latex数学公式。
初始值
1 | IV =7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e |
Python claripy
模块实现向量似乎是个好想法。
1 | self.IV = claripy.BVV(0x7380166f_4914b2b9_172442d7_da8a0600_a96f30bc_163138aa_e38dee4d_b0fb0e4e, 32*8) |
常量
1 | def T_j(j:int): |
布尔函数
1 | def FF_j(self, X, Y, Z, j:int): |
置换函数
1 | def ROL32(self, Num, i): |
算法
对长度为l
(小于2**64
比特)的消息m
,生成256比特的哈希值
填充
长度l
的消息
先添加比特1到末尾
再添加k
个0
k
要满足
$$
l + 1 + k =448\ mod\ 512
$$
然后再添加64位,该串是长度l
的二进制表示。
1 | def _getLenBit(self, m:bytes): |
迭代压缩
1 | def recur(self, m): |
将填充后的消息m'
分组为B
,一组512比特。
然后进行迭代压缩。其中主要使用CF
压缩函数。
消息扩展
将B
拓展生成132个字,用于CF
函数。
1 | def messageExpand(self, B): |
压缩函数
1 | def CF(self, inV, inB): |
杂凑值
256比特
1 | self.V[n] |
Python源码
这是我自己实现的。
1 | # from ctypes import c_uint32 |
C源码
C语言实现国密SM3算法 - 简书 (jianshu.com)
1 |
|
总结
看上去是很一般的哈希流程,跟SHA有异曲同工之妙。
参考
302a3ada057c4a73830536d03e683110.pdf (sca.gov.cn)
python实现sm3算法_mt 2333的博客-CSDN博客_python sm3
C语言实现SM3_嘤3的博客-CSDN博客_c语言实现sm3算法
C语言实现国密SM3算法 - 简书 (jianshu.com)
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2022/03/26/SM3/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!