VPN:SM3认证算法原理
SM3密码杂凑算法是中国国家密码管理局于2010年公布的中国商用密码杂凑算法标准(其实也是哈希算法,或者单向散列算法)。该算法由王小云等人设计,消息分组为512位,经过填充和迭代压缩,生成256位的杂凑值。总体来说,SM3算法的压缩函数与SHA-256的压缩函数具有相似结构,但SM3密码杂凑算法的设计更加复杂。本文简单介绍SM3密码杂凑算法的消息填充和迭代压缩原理。
1. SM3算法消息填充原理
在SM3密码杂凑算法的消息填充方面,原始消息(包括密钥和初始消息)长度(l)也是要小于264位的,填充的方法其实与MD5一样,也是先在原始消息的最后加一位“1”,再添加k个“0”,最终要使l+1+k除以512后的余数为448,取其最小的非负整数。然后用一个64位的比特串标识原始消息的长度l。填充后的消息M正好是512位的倍数。
下面举一个不带密钥的SM3杂凑算法消息填充的示例来帮助大家理解。如一个原始消息(本示例不带密钥,“原始消息”也即前面的“初始消息”)为:01010101111010 1111010100001,一共27位,即l=24。
先在原始的最后加一位“1”,这时一共就有28位了;
再用448−28,得到还需要在再后面添加420位的“0”;
再在最后用64位来表示原始消息长度“27”,得到用于标识原始消息长度的64位值为:000......00(前面一共有59位“0”)11011。
整个填充过程如图1所示。填充后整个用于杂凑运算的消息512位。
图1 SM3密码杂凑算法的填充示例
2. SM3算法消息迭代压缩原理
迭代压缩是SM3杂凑算法的关键,但这里的原理比较复杂,作为网络管理和维护的人员可不深入了解。
迭代压缩的基本原理如下:
首先将第一个512位的消息块利用对应的压缩函数,压缩成某一固定长度的比特串;
然后再将第一个512位消息块压缩后的固定长度比特串(具体长度与整个消息所划分的512位块多少有关),以及第二个512位消息块一起再利用压缩函数,又压缩成某一固定长度的比特串;
然后再将这个比特串再将作为第三个512位消息块压缩运算的输入,连同第三个512位消息块一起利用压缩函数,再压缩成某一固定长度的比特串,以此类推;
直到最后一个512位消息也被压缩成同样固定长度的比特串。最后再将所有这些512位消息块压缩后的固定长度比特串依次串联起来就是最终的杂凑值了。
