【学习记录】【密码学】国密SM3密码杂凑算法

0. 前言

        看课题组论文看到密码学这一块,感觉在工程应用方面比较有价值。于是查了一些网上的帖子和官方文档,决定写个学习记录。

1. 本文符号

ABCDEFGH8个字寄存器或它们的值的串联
B^{(i)}第i个消息分组
mod模运算
32比特异或运算
< < <k循环左移k比特运算
\leftarrow左向赋值运算符

2. 算法描述

2.1 填充与分组

        假设消息m的长度为l bit,首先在消息末尾补“1”,然后补上k个“0”,k是需要满足l+1+k \equiv 448mod512的最小非负整数。最后将长度l表示为64bit,添加到填充消息末尾,形成填充消息 m'。(简单来说就是在消息m末尾补1→再补最少的k个0→再补上64bit,最终形成消息长度为512整数倍的填充消息 m')如图1.

图1 填充示例

         分组就是将得到的填充消息m' 分为n个长度为512bit的组,m' = B^{(0)}B^{(1)}...B^{(n-1)}

2.2 消息扩展

        分组消息B^{(i)}的长度为512bit(16字,字=32bit),消息扩展环节需要将16字扩展为132字,并分为两组。分别为[W_{0},W_{1},...W_{67}][W_{0}^{'},W_{1}^{'}...W_{63}^{'}]。扩展方法为:

图2 消息扩展步骤

 2.3 迭代压缩函数(SM3算法核心)

        这里称为迭代压缩函数是因为除第一次压缩以外,每次压缩都用到了前一次压缩的结果。直接上官方描述:

图3 压缩函数

         初始值由官方给出,V^{(0)}=7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e

        也就是说ABCDEFGH初始值是确定的,要注意字的存储为大端格式。光看公式可能有些难以理解,知乎@仲夏夜的乙醇 制作了下图比较直观(下图省略了for循环后需要将压缩结果与初始值进行异或的步骤)

图4 压缩过程

 2.4 输出

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

3. 参考

1.SM3密码杂凑算法原理简述 - 知乎

2.国家密码管理局关于发布《SM3密码杂凑算法》公告(国密局公告第22号)_国家密码管理局

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值