什麼是安全雜湊演算法SHA256?

王明輝發表於2018-03-05

  安全雜湊演算法SHA(Secure Hash Algorithm)是美國國家安全域性 (NSA) 設計,美國國家標準與技術研究院(NIST) 釋出的一系列密碼雜湊函式,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等變體。主要適用於數字簽名標準(DigitalSignature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。下面以 SHA-1為例,介紹該演算法計算訊息摘要的原理。

 
  對於長度小於2^64位的訊息,SHA1會產生一個160位的訊息摘要。當接收到訊息的時候,這個訊息摘要可以用來驗證資料的完整性。在傳輸的過程中,資料很可能會發生變化,那麼這時候就會產生不同的訊息摘要。

  SHA1有如下特性:不可以從訊息摘要中復原資訊;兩個不同的訊息不會產生同樣的訊息摘要。

  一、術語和概念

  (一)位(Bit),位元組(Byte)和字(Word)

  SHA1始終把訊息當成一個位(bit)字串來處理。本文中,一個“字”(Word)是32位,而一個“位元組”(Byte)是8位。比如,字串“abc”可以被轉換成一個位字串:01100001 01100010 01100011。它也可以被表示成16進位制字串:0x616263.

  (二)運算子和符號

  下面的邏輯運算子都被運用於“字”(Word)

  X^Y = X,Y邏輯與

  X \/ Y = X,Y邏輯或

  X XOR Y= X,Y邏輯異或

  ~X = X邏輯取反

  X+Y定義如下:

  字 X 和Y 代表兩個整數 x 和y, 其中0 <= x < 2^32 且 0 <= y < 2^32. 令整數z= (x + y) mod 2^32. 這時候 0 <= z < 2^32. 將z轉換成字Z,那麼就是 Z = X + Y.

  迴圈左移位操作符Sn(X)。X是一個字,n是一個整數,0<=n<=32。Sn(X)= (X<<n)or(x>>32-n)

  X<<n< span="">定義如下:拋棄最左邊的n位數字,將各個位依次向左移動n位,然後用0填補右邊的n位(最後結果還是32位)。X>>n是拋棄右邊的n位,將各個位依次向右移動n位,然後在左邊的n位填0。因此可以叫Sn(X)位迴圈移位運算

  二、SHA1演算法描述

  在SHA1演算法中,我們必須把原始訊息(字串,檔案等)轉換成位字串。SHA1演算法只接受位作為輸入。假設我們對字串“abc”產生訊息摘要。首先,我們將它轉換成位字串如下:

  01100001 0110001001100011

  ―――――――――――――

  ‘a’=97 ‘b’=98‘c’=99

  這個位字串的長度為24。下面我們需要5個步驟來計算MD5。

  (一)補位

  訊息必須進行補位,以使其長度在對512取模以後的餘數是448。也就是說,(補位後的訊息長度)%512 = 448。即使長度已經滿足對512取模後餘數是448,補位也必須要進行。

  補位是這樣進行的:先補一個1,然後再補0,直到長度滿足對512取模後餘數是448。總而言之,補位是至少補一位,最多補512位。還是以前面的“abc”為例顯示補位的過程。

  原始資訊:01100001 01100010 01100011

  補位第一步:0110000101100010 01100011 1

  首先補一個“1”

  補位第二步:0110000101100010 01100011 10…..0

  然後補423個“0”

  我們可以把最後補位完成後的資料用16進位制寫成下面的樣子

  61626380 0000000000000000 00000000

  00000000 0000000000000000 00000000

  00000000 0000000000000000 00000000

  00000000 00000000

  現在,資料的長度是448了,我們可以進行下一步操作。

  (二)補長度

  所謂的補長度是將原始資料的長度補到已經進行了補位操作的訊息後面。通常用一個64位的資料來表示原始訊息的長度。如果訊息長度不大於2^64,那麼第一個字就是0。在進行了補長度的操作以後,整個訊息就變成下面這樣了(16進位制格式)

  61626380 0000000000000000 00000000

  00000000 0000000000000000 00000000

  00000000 0000000000000000 00000000

  00000000 0000000000000000 00000018

  如果原始的訊息長度超過了512,我們需要將它補成512的倍數。然後我們把整個訊息分成一個一個512位的資料塊,分別處理每一個資料塊,從而得到訊息摘要。

  (三)使用的常量

  一系列的常量字K(0),K(1), ... , K(79),如果以16進位制給出。它們如下:

  Kt = 0x5A827999 (0<= t <= 19)

  Kt = 0x6ED9EBA1 (20<= t <= 39)

  Kt = 0x8F1BBCDC (40<= t <= 59)

  Kt = 0xCA62C1D6 (60<= t <= 79).

  (四)需要使用的函式

  在SHA1中我們需要一系列的函式。每個函式ft (0 <= t <= 79)都操作32位字B,C,D並且產生32位字作為輸出。ft(B,C,D)可以如下定義

  ft(B,C,D) = (B ANDC) or ((NOT B) AND D) ( 0 <= t <= 19)

  ft(B,C,D) = B XOR CXOR D (20 <= t <= 39)

  ft(B,C,D) = (B ANDC) or (B AND D) or (C AND D) (40 <= t <= 59)

  ft(B,C,D) = B XOR CXOR D (60 <= t <= 79).

  (五)計算訊息摘要

  必須使用進行了補位和補長度後的訊息來計算訊息摘要。計算需要兩個緩衝區,每個都由5個32位的字組成,還需要一個80個32位字的緩衝區。第一個5個字的緩衝區被標識為A,B,C,D,E。第二個5個字的緩衝區被標識為H0,H1, H2, H3, H4。80個字的緩衝區被標識為W0,W1,..., W79

  另外還需要一個一個字的TEMP緩衝區。

  為了產生訊息摘要,在第4部分中定義的16個字的資料塊M1,M2,..., Mn

  會依次進行處理,處理每個資料塊Mi 包含80個步驟。

  在處理每個資料塊之前,緩衝區{Hi} 被初始化為下面的值(16進位制)

  H0 = 0x67452301

  H1 = 0xEFCDAB89

  H2 = 0x98BADCFE

  H3 = 0x10325476

  H4 = 0xC3D2E1F0.

  現在開始處理M1, M2,... , Mn。為了處理 Mi,需要進行下面的步驟

  (1). 將Mi 分成 16 個字 W0, W1, ... , W15,W0 是最左邊的字

  (2). 對於t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8XOR Wt- 14 XOR Wt-16).

  (3). 令A = H0, B = H1, C = H2, D = H3, E = H4.

  (4) 對於t = 0 到 79,執行下面的迴圈

  TEMP = S5(A) +ft(B,C,D) + E + Wt + Kt;

  E = D; D = C; C =S30(B); B = A; A = TEMP;

  (5). 令H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.

  在處理完所有的 Mn, 後,訊息摘要是一個160位的字串,以下面的順序標識

  H0 H1 H2 H3 H4.

  對於SHA256、SHA384、SHA512。你也可以用相似的辦法來計算訊息摘要。對訊息進行補位的演算法完全是一樣的。

   三、SHA演算法被破解了嗎?

2013年9月10日美國約翰霍普金斯大學的電腦科學教授,知名的加密演算法專家,Matthew Green被NSA要求刪除他的一份關於破解加密演算法的與NSA有關的部落格。 同時約翰霍普金斯大學伺服器上的該部落格映象也被要求刪除。

 

加密演算法專家,美國約翰霍普金斯大學教授Matthew Green

  但當記者向該大學求證時,該校稱從未收到來自NSA的要求要刪除部落格或映象的資料,但記者卻無法在原網址再找到該部落格。幸運的是,從谷歌的快取可以找到該部落格。該部落格提到NSA每年花費2.5億美元來為自己在解密資訊方面獲取優勢,並列舉了NSA的一系列見不得人的做法。

 

 在BitcoinTalk上,已經掀起了一輪爭論:到底SHA-2是否安全?

部分認為不安全的觀點包括:

  1. NSA製造了sha-2, 我們不相信NSA,他們不可能不留後門。
  2. 稜鏡事件已經明白的告訴我們,政府會用一切可能的手段來監視與解密。
  3. 雖然有很多人會研究SHA-2,且目前沒有公開的證據表明有漏洞。但沒有公開這並不能代表就沒有,因為發現漏洞的人一定更傾向於保留這個祕密來自己利用,而不是公佈。

部分認為安全的觀點包括:

  1. SHA-2是應用廣泛的演算法,應該已經經歷了實踐的檢驗。
  2. 美國的對頭中國和俄國都有很多傑出的數學家,如果有問題的話,他們肯定已經發現了。
  3. 如果真的不安全,世界上安全的東西就太少了,我不能生活在提心吊膽裡,所以我選擇相信安全。

 

 

相關文章