SHA算法基本認證原理
SHA(Secure Hash Algorithm,安全哈希算法)主要適用于數字簽名,也是一種不可逆的MAC算法,但比MD5算法更加安全。目前它有三種主要的版本,即SHA-0、SHA-1、SHA-2和SHA-3。其中SHA-2和SHA-3版本中又有多種不同子分類,如在SHA-2中又根據它們最終所生成的摘要消息長度的不同又包括SHA-224、SHA-256、SHA-384和SHA-512等幾種。
1. SHA算法基本認證原理
整個SHA算法的認證原理與MD5算法認證原理極為相似,同樣先把原始消息劃分成固定長度的塊,最后加上用于標識原始消息長度的位(不同SHA版本中用于標識原始消息長度的位數不一樣),再結合共享密鑰(可以是共同設置的預共享密鑰,也可以是對端公鑰),利用一系列的邏輯算法生成固定長度的消息摘,用于在接收端進行消息完整性驗證和消息源身份認證。
在各種版本SHA算法中(因為SHA-3的算法與其他SHA版本的算法有較大不同,故在此不作介紹),進行散列運算時所涉及的一些參數特性不完全相同,具體如表1所示。從表中可以看出,SHA-0、SHA-1算法與MD5類似,都是把輸入原始消息的二進制串劃分成512位的塊,最后一塊的最后64位用于表示原始消息的長度,不足512位時也要進行填充。

表1 主要MAC算法的基本參數特性比較
2. SHA算法消息填充原理
SHA算法中在進行消息分塊時也可能要進行填充。其填充的方法與MD5算法一樣,也是先加1位“1”,然后填充若干位“0”。如SHA-0和SHA-1最后會把劃分和填充后的消息與共享密鑰進行80輪的邏輯運算處理,得到一個160位的摘要消息。但SHA-0和SHA-1仍然容易出現碰撞(即有可能多個不同消息運算后得到相同的摘要),所以目前主要是采用SHA-2版本。
下面僅以SHA-512(也有寫成SHA2-256的)為例介紹其基本的摘要運算過程。其他SHA版本的基本摘要算法類似。
(1)把包括密鑰和初始消息在內的二進制比特串(假設稱之為“原始消息”,小于2128),以及在最后新增一個用于記錄原始消息二進制長度的128位一起被劃分成一個個1024位(32個32位字長)的塊;
當采用SHA-512進行運算時,如果原始消息長度大于等于2128時,只取前面2128?1位進行摘要運算。
(2)同樣再對以上劃分的1024位的塊經過系列“與”(And)、“或”(OR)、“非”(NOT)、“異或”(AOR)邏輯算法(具體算法我們可以不做了解)處理后,輸出8個64位分組,將這8個64位分組級聯后將生成一個512位散列值(消息摘要)。
這里同樣涉及“填充”操作,因為大多數原始消息(包括密鑰和初始消息),加上128位后可能仍不能恰好被1024整除,也就是原始消息的二進制位數除以1024后的余數不是896(1024-128=896),這時就表明需要對原始信息進行填充處理了。但這里同樣有兩種情況:一種是余數小于896,另一種就是余數大于896。
如果原始消息二進制位數除以1024后的余數小于896,則先在原始消息的最后一個1024位塊的最后填充一個1,然后再填充若干位0,使得該塊的原始消息總長度等于896位,然后加上用于標識原始消息長度的128位,正好形成一個1024位的塊。
如一個有1500位的消息,則可劃分成兩個1024位的塊:第一個塊是1024位全部為原始消息;第二個塊中有476位原始消息,然后進行填充:先在最后填充1位“1”,再填充419位“0”,使得476位原始信息+1位,1+419位,0=896位,最后再附上128位用于標識原始信息長度(1500)的值。
如果如果原始消息二進制位數除以1024后的余數大于896,這時要新增一個1024位的塊了。首先是在原始消息的最后一個1024位塊的最后填充一個1,然后再填充若干位0,使得該塊的原始消息總長度等于1024位;接著再新增一個塊,前面896位均填充0,再加上用于標識原始消息長度的128位,形成新的一個1024位塊。
如有一個1924位的消息,則最終會劃分成三個1024位的塊:第一個塊是1024位全部為原始消息;第二個塊中有900位原始消息,然后進行填充:先在最后填充1位“1”,再填充123位“0”,使得900位原始信息+1位,1+123位,0=1024位;最后是一個新增的塊,也要進行填充:先在前面填充896位0,最后再附上128位用于標識原始信息長度(1924)的值。