当前位置:   article > 正文

国密哈希hash算法SM3原理分析

sm3

基本概念

SM3是我国采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。从广义上讲,安全散列函数、杂凑函数、hash函数指的都是一类函数,或者说就是一类函数的不同说法。

SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。

哈希算法

哈希算法(Hash Algorithm)又称为散列算法,杂凑算法。由于在信息完整性认证和数字签名等方面的应用,哈希算法在当今时代的信息安全领域非常重要。不同哈希算法的参数性能不同,NIST (National Institute of Standards and Technology,美国国家标准与技术研究院)先后发布三种标准的杂凑算法 SHA-0、SHA-1 和 SHA-2,由于 MD5 和 SHA-1 相继被攻破,SHA-2在目前例如经济和军事等重要安全领域中应用逐渐增加,其中应用较为广泛的是SHA-256 密码杂凑算法。中国自主研发设计的杂凑算法 SM3 与 SHA-256 具有相同的消息摘要长度,作为商用密码杂凑算法在商业领域应用非常广泛。同时为了进一步寻求更高安全系数的杂凑算法,NIST 于 2012 年 10 月发布新的标准 SHA-3系列,该算法可以产生任意长度的消息杂凑值。根据生日攻击原理,消息摘要值越长,算法抗穷举攻击的能力越强,对应算法的安全性也越高。

常用密码学杂凑算法的参数对比

算法

输入消息长度

分组长度

字长

迭代次数

摘要值长度

MD5

无限制

512bit

32bit

4

128bit

SHA-1

<=264bit

512bit

32bit

4

160bit

SM3

<=264bit

512bit

32bit

64

256bit

SHA-256

<=264bit

512bit

32bit

64

256bit

SHA3-256

无限制

1088bit

64bit

24

256bit

函数结构

典型的密码杂凑算法选用迭代hash函数结构,这种结构是由Merkle提出,Damgard建议压缩函数的设计原则,因此也叫Merkle-Damgard结构。该体系结构的设计包括两部分:信息填充分组和迭代hash函数。Hash函数重复使用压缩函数f,它包含的输入有:前一步压缩得到的结果CV(i),固定长度的消息分组;它的输出作为下一步压缩的输入值,其中初始链接变量CV(0)由算法指定,最后一个分组经迭代压缩后的结果作为输入的消息摘要值。

在Merkle-Damgard结构中,消息按照CBC分组密码链接的方式参与迭代运算。输入信息根据填充规则完成填充后并划分,得到若干个长度相同的分组。按照分组顺序先后输入迭代函数进行压缩运算。迭代函数中包含分组的扩展和压缩函数的迭代计算两部分。首先将分组按照扩展置换原则生成若干消息字,这些消息字作为因子参与压缩函数过程,完成对上一步压缩结果值的计算,因此在算法实现过程中还要完成分组扩展模块的设计。

 硬件实现架构

整体架构

杂凑算法SM3输入消息的长度被限制在264bit内,消息分组长度为512bit,经扩展模块处理产生68+64=132个长度为32bit的消息字,消息字参与压缩函数;初始值经过64次函数压缩产生的计算结果与初始值进行异或操作后,作为下一个消息分组迭代压缩的输入;当所有分组计算完成后输出256bit的杂凑值。

消息填充

算法说明 

SM3算法输入数据的填充需要遵循以下规则:按照消息输入先后顺序,首先在消息末尾补一比特“1”,再补若干比特“0”,0的添加数等于使得填充后的消息长度与448mod512同余的最小值。然后再将明文长度信息(64bit)附加在最后,完成对消息的填充。如果将消息message的比特长度记为L。首先将一比特“1”添加到消息的末尾,之后再添加K比特“0”,K是满足L+1+K448mod512的最小的非负整数。然后再添加一个64位比特串,该比特串是长度L的十六进制表示。填充后的消息长度恰好是512的整数倍,将其每512比特一组划分成n个分组block_i。消息填充分组前后的结构变化如图所示

硬件实现方案

数据预处理模块是将输入的明文数据按照规则填充,并分成512bit一组的模块,是SM3杂凑算法的基础组成部分。初始状态无数据输入,当数据有效信号到来时状态机跳转至工作状态,由于采用二合一结构,一个消息分组的运算需要经过32个周期完成64次迭代,每个周期数据输入长度512÷32=16比特。将分组消息传递给下一个模块处理,循环链接所有明文输入直到最后一组数据到来状态机进入填充状态,此时根据vbit的值判断输入数据的有效长度,计算该输入数据的长度并存储。根据当前分组的长度选择判断需要的填充内容,并将消息的长度信息附加在最后一个分组末尾。

在接收到端口的有效数据后,首先将其缓存到一个32bit位宽,深度为16的双口ram中。当接收完一组512bit的数据时,仍然没有收到Data_in_last信号,说明此数据组个数多余512bit,不需要做填充处理;当没有接收完一组512bit数据即存在Data_in_last时,此时需要做填充处理,在代码设计时,为实现性能,此处只记录有效数据在ram中的地址即可,当读取到后面地址的数据时,再做填充处理。

分组扩展

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号