0. 前言
看课题组论文看到密码学这一块,感觉在工程应用方面比较有价值。于是查了一些网上的帖子和官方文档,决定写个学习记录。
1. 本文符号
| ABCDEFGH | 8个字寄存器或它们的值的串联 |
| 第i个消息分组 | |
| mod | 模运算 |
| ⊕ | 32比特异或运算 |
| 循环左移k比特运算 | |
| 左向赋值运算符 |
2. 算法描述
2.1 填充与分组
假设消息的长度为
bit,首先在消息末尾补“1”,然后补上
个“0”,
是需要满足
的最小非负整数。最后将长度
表示为64bit,添加到填充消息末尾,形成填充消息
。(简单来说就是在消息m末尾补1→再补最少的
个0→再补上64bit,最终形成消息长度为512整数倍的填充消息
)如图1.
分组就是将得到的填充消息 分为n个长度为512bit的组,
2.2 消息扩展
分组消息的长度为512bit(16字,字=32bit),消息扩展环节需要将16字扩展为132字,并分为两组。分别为
、
。扩展方法为:
2.3 迭代压缩函数(SM3算法核心)
这里称为迭代压缩函数是因为除第一次压缩以外,每次压缩都用到了前一次压缩的结果。直接上官方描述:
初始值由官方给出,。
也就是说ABCDEFGH初始值是确定的,要注意字的存储为大端格式。光看公式可能有些难以理解,知乎@仲夏夜的乙醇 制作了下图比较直观(下图省略了for循环后需要将压缩结果与初始值进行异或的步骤)。
2.4 输出
输出256比特的杂凑值
990

被折叠的 条评论
为什么被折叠?



