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位消息塊壓縮后的固定長度比特串依次串聯起來就是最終的雜湊值了。