NO IMAGE

1. 什麼是SHA-256?

        SHA-256是SHA2中的一種。對於長度L(L<)位元的訊息m,經過對訊息的填充和迭代壓縮,SHA-256可以生成一個被稱為訊息摘要的256位(32位元組)雜湊值,雜湊值通常的呈現形式為64個十六進位制數。

2.  SHA-256演算法實現步驟

2.1 把訊息轉換為位字串

       SHA-256演算法是按照位作為輸入,所以進行計算前必須把原始訊息(比如字串、檔案等)轉換成位字串。

  比如,對字串“abc”產生訊息摘要,‘a’=97 ‘b’=98 ‘c’=99,先轉換成24位的字串:

            01100001 01100010 01100011

2.2 對轉換得到的位字串進行補位操作

  訊息必須進行補位,使其長度在對512取模以後的餘數是448,即(補位後的訊息長度)%512 = 448。

  對訊息進行補位時,先在後面補一個1,如果不滿足要求,再補0直到滿足對512取模餘數為448。這就意味著,補位至少補一位(原訊息位數為512n 447),最多補512位(原訊息位數為512n 448)。

  還是以前面的“abc”為例顯示補位的過程:

  原始資訊: 01100001 01100010 01100011

  補位第一步,首先補一個1:01100001 01100010 01100011 1

  可以確定的是,如果用一個位元組來表示一個字元,補1之後肯定不滿足條件,仍需繼續補位。

  補位第二步,後面補0直到總長度對512取模餘數為448,這裡補423個0,使總長度達到為448:

            01100001 01100010 01100011 1000…..00

  補位完成後的資料轉換為16進位制:

  61626380 00000000 00000000 00000000

       00000000 00000000 00000000 00000000

       00000000 00000000 00000000 00000000

       00000000 00000000

  從16進位制資料裡可以看到,我們也可以直接採用16進位制的方式進行補位,我們先補80,看是否滿足長度對64取餘的結果為56,不滿足則繼續補0。

2.3 訊息擴充套件、分組處理

  這一步中,要將原始訊息(沒有進行補位操作之前)的長度(二進位制位數)附加到已經補位的訊息之後。

  通常用一個64位的資料來表示原始訊息的長度。如果訊息長度不大於2^64,那麼第一個字就是0。

  補長度的操作以後,整個訊息(16進位制)如下:

        61626380 00000000 00000000 00000000

        00000000 00000000 00000000 00000000

        00000000 00000000 00000000 00000000

        00000000 00000000 00000000 00000018

  然後,將整個訊息拆分為一個一個的512位的資料塊M1,M2,…,Mn,然後分別對每一個資料塊Mi (1≤i≤n)做處理,得到訊息摘要。

  注意,這裡是64位,上一步補位後的長度是512k 448,k≥0,這樣,512k 448 64=512(k 1),恰好可以被512整除。

在我們舉得例子裡,一共只有512位,因此做為一個資料塊進行處理。

填充完了之後訊息被分為了512位的訊息分組。每個分組被分為16個32位的子分組,記為:M(i)0、M(i)1、…、M(i)15。將對N個訊息分組進行如下操作。

a、64個訊息列表的生成

    For t = 0 to 15

    Wt = M(i)t

    For t = 16 to 63

    Wt = SSIG1(W(t-2)) W(t-7) SSIG0(w(t-15)) W(t-16)

2.4 使用的常量和函式

        SHA-256採用64個32位的常數序列。通常記為:K0、K1、……、K63,這些常數的取值是前64個質數的立方根的小數部分的前32位。

        SHA-256採用6個邏輯函式,每個函式均基於32位字運算,這些輸入的32位字我們記為x、y、z,同樣的這些函式的計算結果也是一個32位字。

2.5計算訊息摘要

  訊息列表每32位分為一個子分組,被標記為W0、W1、…、W63。8個工作變數分別為a、b、c、d、e、f、g和h,8個雜湊值被標記為h(i)0、h(i)1、…、H(i)7,並保留初始雜湊值H(0),替換為每一個連續的中間雜湊值(在處理完每個訊息分組後) H(i),並以最終的雜湊值H(N)結束,在處理完所有N塊後。還使用兩個臨時變數T1和T2。

(1)初始化工作變數

而對於SHA-256來說,初始雜湊值H(0)由以下8個32位的十六進位制陣列成。這些字由前8個質數的平方根的小數部分的錢32位組成。

    a = H(0)0 = 6a09e667

    b = H(0)1 = bb67ae85

    c= H(0)2 = 3c6ef372

    d = H(0)3 = a54ff53a

    e = H(0)4 = 510e527f

    F = H(0)5 = 9b05688c

    g = H(0)6 = 1f83d9ab

    H(0)7 = 5be0cd19

(2)執行雜湊計算

    For t = 0 to 63

    T1 = h BSIG1(e) CH(e,f,g) Kt Wt

    T2 = BSIG0(a) MAJ(a,b,c)

    h = g

    g = f

    f = e

    e = d T1

    d = c

    c = b

    b = a

    a = T1 T2

(3)輸出計算結果

    H(i)0 = a H(i-1)0

    H(i)1 = b H(i-1)1

    H(i)2 = c H(i-1)2

    H(i)3 = d H(i-1)3

    H(i)4 = e H(i-1)4

    H(i)5 = f H(i-1)5

    H(i)6 = g H(i-1)6

    H(i)7 = h H(i-1)7

最後得到H(i)0、H(i)1、H(i)2、H(i)3、H(i)4、H(i)5、H(i)6、H(i)7的串聯值,256位的訊息摘要。

3.  SHA-256安全性分析

        Hash函式的安全性很大程度上取決於抗強碰撞的能力,即攻擊者找出兩個訊息M和Mt,M≠Mt,使得H(M)=HMt  ,因此,評價一個Hash函式的安全性,就是看攻擊者在現有的條件下,是否可以找到該函式的一對碰撞。目前已有的對Hash函式攻擊的方法包括生日攻擊、彩虹表攻擊、差分攻擊等。

  生日攻擊:生日攻擊是一種可用於攻擊任何型別函式Hash函式的攻擊方法。從攻擊原理上看,它沒有利用Hash函式的結構和任何代數弱性質,只依賴與Hash值的長度。因此,抵禦生日攻擊最有效的方法是Hash值必須有足夠的長度。

  差分攻擊:差分攻擊是目前破譯迭代Hash函式最有效的手法之一,其基本方法是利用明文的輸入差值對輸出差值的影響,運用差分的高概率的繼承或者消除來產生最終的相同輸出。

  用於訊息唯一性和資料完整性驗證的Hash函式,其安全性依賴於函式本身的屬性和對抗碰撞的抵抗。Hash函式的演算法結構特點和Hash值的長度是決定函式碰撞性的而主要因素,Hash值越長,越能抵禦生日攻擊。SHA-256有256位元Hash值,MD5和SHA-1分別有128和160位元的Hash值。因此,SHA-256比MD5和SHA-1能抵抗生日攻擊。通過對Chabaud-Joux攻擊SHA-256的分析,找到了SHA-256的一個部分碰撞,其複雜度為2^66,但無法找到SHA-256的一個整體碰撞,因此SHA-256演算法也能抵禦現有的差分攻擊。由此可見,在抵禦生日攻擊和抵禦已知差分攻擊方面,SHA-256演算法比現在廣泛使用的MD5和SHA-1等更具安全性。