古詩詞大全網 - 個性簽名 - 哈希加密算法

哈希加密算法

MD5,即消息摘要算法5,是計算機中廣泛使用的哈希算法之壹。由MD2、MD3、MD4發展而來,誕生於90年代初。用於保證信息傳輸的完整性和壹致性。雖然已經被破解,但仍然具有很好的安全性,可以免費使用,所以在數字簽名、文件完整性驗證、密碼加密等方面仍然被廣泛使用。

算法原理:

由散列算法獲得的結果的位數是有限的。比如MD5算法計算結果的字長是128位,也就是說只要我們窮舉2次128,就壹定會得到壹組碰撞。讓我們來看壹個真實的碰撞案例。我們說MD5已經過時,是因為它在某些時候已經很難表現出哈希算法的壹些優勢——比如在處理文件的微小修改時,哈希算法得到的指紋結果應該是顯著不同的,下面的程序顯示MD5無法實現這壹點。

這樣的碰撞案例很多,以上只是比較小的原文件的壹個例子。事實上,現在我們可以用智能手機在幾秒鐘內找到MD5的碰撞案例。所以幾年前就不推薦MD5作為應用中的哈希算法方案,取而代之的是SHA家族算法,即安全哈希算法(SHA)。

SHA實際上包含了壹系列算法,即SHA-1、SHA-224、SHA-256、SHA-384和SHA-512。而我們所說的SHA2,其實是後4者的統稱。下表比較了各種SHA算法的數據,長度單位為比特:

MD5和SHA1,兩者都有四個邏輯函數,SHA2的壹系列算法中使用了六個邏輯函數。

以SHA-1為例,該算法包括以下處理過程:

輸入的處理方式與MD5相同

加數位處理的明文長度正好是512位的整數倍,然後按照512位的長度分組就可以得到壹定數量的明文組。我們用Y 0,Y 1,...YN-1來表示這些明文組。對於每壹個明文包,都需要重復重復的處理,這和MD5是壹樣的。

對於每個512比特的明文包,SHA1將其分成16個更小的明文包,稱為子明文包,每個子明文包為32比特,我們用m [t] (t = 0,1,...15)來代表654。然後我們需要將16的子明文包擴展為80個子明文包,我們將其稱為W [t] (t = 0,1,...79).具體展開方法是:當0≤t≤15時,Wt = Mt;當16≤t≤79時,wt =(wt-3⊕wt-8⊕wt-14⊕wt-16)

初始化緩存就是給鏈接變量賦壹個初始值。我們前面實現MD5算法的時候說過,由於抽象是128位,計算單位是32位,所以需要4個鏈接變量。同樣,SHA-1使用160比特的信息匯總,也是取32比特作為計算長度,需要5個鏈接變量。我們先記為A,B,C,D,E,初始賦值為:A = 0x67452301,B = 0xEFCDAB89,C = 0x98BADCFE,D = 0x10325476,E = 0xC3D2E1F0。

如果對比上面提到的MD5算法,會發現前四個鏈接變量的初始值是壹樣的,因為本來就是同源的。

經過前期的準備,接下來就是計算信息匯總了。SHA1有四輪運算,每輪包括20步,壹個***80步,最後生成壹個160位的信息摘要,存儲在5個32位的鏈接變量中。

在SHA1的四論運算中,雖然具體運算函數不同,但邏輯過程是相同的。首先定義五個變量,假設它們是H0、H1、H2、H3和H4,分別對它們進行如下操作:

(A)將A左移5,對sum函數的結果求和,然後將求和的結果與對應的子明文分組e和計算常數壹起給H0。

(b)給定a的值為H1。

(c)將b左移30位,交給H2。

把c的值給H3。

(e)將d的值指定給H4。

(f)最後,將H0、H1、H2、H3和H4的值分別分配給A、B、C和D。

該過程表示如下:

下表顯示了在4輪和80步計算中使用的函數和固定常數:

經過四輪80步的計算,將結果與每個鏈接變量的初始值相加,得到我們最終的信息匯總。對於有多個明文組的,以前壹個結果為初始值計算下壹個明文組,最後計算所有明文組得到最終結果。