SHA 加密算法
-
算法簡介
SHA安全散列算法SHA (Secure Hash Algorithm,SHA)
是美國國家標準技術研究所發佈的國家標準FIPS PUB 180,最新的標準已經於2008年更新到FIPS PUB 180-3。其中規定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512這幾種單向散列算法。SHA-1,SHA-224和SHA-256適用於長度不超過2^64二進制位的消息。SHA-384和SHA-512適用於長度不超過2^128二進制位的消息。
散列是信息的提煉,通常其長度要比信息小得多,且爲一個固定長度。加密性強的散列一定是不可逆的,這就意味着通過散列結果,無法推出任何部分的原始信息。任何輸入信息的變化,哪怕僅一位,都將導致散列結果的明顯變化,這稱之爲雪崩效應。散列還應該是防衝突的,即找不出具有相同散列結果的兩條信息。具有這些特性的散列結果就可以用於驗證信息是否被修改。
Note:hash即散列,
圖1: SHA加密算法流程簡圖
-
SHA加密算法用途
數字簽名、數字時間戳、數字證書
比如:數字簽名,在傳送過程中,Alice不可能真正籤一個名字“Alice”,同消息一塊兒傳送給Bob。(這樣容易被發現,或被攻擊?被篡改?)而是通過一定的加密規則,將明文和密文一塊兒傳送給Bob,讓Bob再根據加密規則,判斷密文準確與否。
-
SHA加密原理以及流程
在SHA1算法中,我們必須把原始消息(字符串,文件等)轉換成位字符串位。SHA1算法只接受位作爲輸入。假設我們對字符串“abc”產生消息摘要。首先,我們將它轉換成位字符串如下:
01100001 01100010 01100011
―――――――――――――
‘a’=97 ‘b’=98 ‘c’=99這個位字符串的長度爲24。
下面我們需要5個步驟來計算SHA。
3.1 補位
消息必須進行補位,以使其長度在對512取模以後的餘數是448。也就是說,(補位後的消息長度)len%512 = 448。即使長度已經滿足對512取模後餘數是448,補位也必須要進行(eg: 消息長度 len1=448,len1%512 = 448,但仍要再補512位,使len1’=448+512=960)。
補位是這樣進行的:先補一個1,然後再補0,直到長度滿足對512取模後餘數是448。總而言之,補位是至少補一位,最多補512位(言下之意:不可能1位都不補)。還是以前面的“abc”爲例顯示補位的過程。
原始信息: 01100001 01100010 01100011
補位第一步:01100001 01100010 01100011 1
首先補一個“1”
補位第二步:01100001 01100010 01100011 10…..0
然後補423個“0”
我們可以把最後補位完成後的數據用16進制寫成下面的樣子
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000
現在,數據的長度是448了,我們可以進行下一步操作。
3.2 補長度
所謂的補長度是將原始數據的長度補到已經進行了補位操作的消息後面。通常用一個64位的數據來表示原始消息的長度。在進行了補長度的操作以後,整個消息就變成下面這樣了(16進制格式)
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018
如果原始的消息長度超過了512,我們需要將它補成512的倍數。然後我們把整個消息分成一個一個512位的數據塊,分別處理每一個數據塊(即SHA一次性最多加密64個字節,512個比特位),從而得到消息摘要(即我們所謂的密文)。
3.3 使用的常量
一系列的常量字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)
3.4 需要使用的函數
在SHA1中我們需要一系列的函數。每個函數ft (0 <= t <= 79)都操作32位字B,C,D並且產生32位字作爲輸出。ft(B,C,D)可以如下定義
ft(B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19)
ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)
ft(B,C,D) = (B AND C) OR (B AND D) OR (C AND D) (40 <= t <= 59)
ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).
3.5 計算消息摘要
必須使用進行了補位和補長度後的消息來計算消息摘要。計算需要兩個緩衝區,每個都由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,需要進行下面的5個步驟
(1). 將 Mi 分成 16 個字 W0, W1, ... , W15, W0 是最左邊的字
(2). 對於 t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8 XOR 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.
-
注意事項
SHA加密算法採用的是 大端存儲模式,即高位數據放在低地址,低位數據放在高地址