国产商用密码算法SM3及其相关标准介绍
2021-08-23谢宗晓甄杰董坤祥
谢宗晓 甄杰 董坤祥



SM3密码杂凑算法发布于2010年12月17日1)。密码杂凑算法也被称作“杂凑算法”“散列算法”或“哈希算法”。在GM/Z 0001—2013《密码术语》中,上述几个术语对应的英文都是hash algorithm。
1 密码杂凑算法
密码杂凑算法的主要功能是将一个任意长的比特串映射到一个固定长的比特串。
假设任意长度的消息M,经过函数H(M)运算后,得到一个固定长度为m的散列值h,如公式(1)所示。
h=H(M) (1)
如果上述运算满足下面3个条件:
(1) 给定任意长度的消息M,容易固定长度的h;
(2)给定h,计算M非常困难;
(3)给定任意长度的消息M,要找到另一个任意长度的消息M′,能够满足H(M)= H(M′),非常困难。
观察(1)和(2),实际就是单向函数的要求,对于(3)而言,这个特性指的是抗碰撞性(collision resistance),即防止不同的输入产生相同的输出。在实践中使用的密码杂凑函数必须具备强抗碰撞性,例如,MD4、MD5和SHA-1都是因为碰撞攻击算法而被攻破。通俗而言,就是这些算法H(M),已经能够产生具备相同散列值h的两条不同消息M和M′。
由于密码杂凑算法这个特性,散列值h,就像是消息的“指纹”。显然,密码杂凑算法可以用于验证消息的完整性(integrity),也可以更广泛地应用于数字签名和验证、消息鉴别码(message authentication code,MAC)的生成和验证,以及随机数的生成等。
2 SM3密码杂凑算法
SM3是一种密码杂凑算法。2012年,SM3被采纳为GM/T 0004—2012行业标准,2016年转化为GB/T 32905—2016国家标准。具体信息如表1所示。
SM3的将输入的消息经过填充和迭代压缩等步骤,生成256比特杂凑值(散列值h)。
GB/T 32905—2016中举了一个通俗易懂的例子,消息01100001 01100010 01100011,长度l为24,首先①,在末尾加“1”,然后②,添加k个“0”凑成512的倍数,最后③,添加一个64位比特串,该比特串是输入消息长度l的二进制表示。……
