目录
1.概述
SM3是我国采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。
在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当。
在信息安全中,有许多重要的应用,都使用了密码散列函数来实现,例如数字签名,消息认证码。
特性
一个理想的密码散列函数应该有四个主要的特性:
-
对于任何一个给定的消息,它都很容易就能运算出散列数值。
-
难以由一个已知的散列数值,去推算出原始的消息。
-
在不更动散列数值的前提下,修改消息内容是不可行的。
-
对于两个不同的消息,它不能给与相同的散列数值。
本文主要介绍了SM3密码杂凑算法的计算方法和计算步骤,感兴趣的读者可以了解SM3算法背后的数学原理,源码会在另一篇文章介绍:SM3密码杂凑算法源码解析_10点43的博客-CSDN博客_sm3 源码。
2、算法描述
2.1 概述
对长度为l(l < 264) 比特的消息m, SM3杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特。
2.2 填充
假设消息m 的长度为l 比特。首先将比特“1”添加到消息的末尾,再添加k 个“0”, k是满足l + 1 + k ≡ 448mod512 的最小的非负整数。然后再添加一个64位比特串,该比特串是长度l的二进制表示。填充后的消息m′ 的比特长度为512的倍数。
例如:对消息01100001 01100010 01100011,其长度l=24,经填充得到比特串:
2.3 迭代压缩
将填充后的消息m′按512比特进行分组:
其中n=(l+k+65)/512。
对m′按下列方式迭代:
FOR i=0 TO n-1
ENDFOR
其中CF是压缩函数, 为256比特初始值IV, 为填充后的消息分组,迭代压缩的结果为。
初始向量为:IV= 7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e
流程如图所示:
2.3 消息扩展
2.4 压缩函数
令A,B,C,D,E,F,G,H为字寄存器,SS1,SS2,TT1,TT2为中间变量,压缩函数,计算过程描述如下:
中间计算过程如图所示: