SHA1算法原理
一.SHA1與MD5差異
SHA1對任意長度明文的預處理和MD5的過程是一樣的,即預處理完後的明文長度是512位的整數倍,但是有一點不同,那就是SHA1的原始報文長度不能超過2的64次方,然後SHA1生成160位的報文摘要。SHA1算法簡單而且緊湊,容易在計算機上實現。
表8-2-1列出了對MD5及SHA1的比較差異之處。讓我們根據各項特性,簡要說明其間的不同。
表8-2-1 MD5與SHA1的比較
差異處 |
MD5 |
SHA1 |
摘要長度 |
128位 |
160位 |
運算步驟數 |
64 |
80 |
基本邏輯函數數目 |
4 |
4 |
常數數目 |
64 |
4 |
● 安全性:SHA1所產生的摘要比MD5長32位。若兩種散列函數在結構上沒有任何問題的話,SHA1比MD5更安全。
● 速度:兩種方法都是主要考慮以32位處理器為基礎的系統結構。但SHA1的運算步驟比MD5多了16步,而且SHA1記錄單元的長度比MD5多了32位。因此若是以硬件來實現SHA1,其速度大約比MD5慢了25%。
● 簡易性:兩種方法都是相當的簡單,在實現上不需要很復雜的程序或是大量存儲空間。然而總體上來講,SHA1對每一步驟的操作描述比MD5簡單。
二.SHA1哈希算法流程
對於任意長度的明文,SHA1首先對其進行分組,使得每一組的長度為512位,然後對這些明文分組反復重復處理。
對於每個明文分組的摘要生成過程如下:
(1) 將512位的明文分組劃分為16個子明文分組,每個子明文分組為32位。
(2) 申請5個32位的鏈接變量,記為A、B、C、D、E。
(3) 16份子明文分組擴展為80份。
(4) 80份子明文分組進行4輪運算。
(5) 鏈接變量與初始鏈接變量進行求和運算。
(6) 鏈接變量作為下一個明文分組的輸入重復進行以上操作。
(7) 最後,5個鏈接變量裏面的數據就是SHA1摘要。
三.SHA1的分組過程
對於任意長度的明文,SHA1的明文分組過程與MD5相類似,首先需要對明文添加位數,使明文總長度為448(mod512)位。在明文後添加位的方法是第一個添加位是l,其余都是0。然後將真正明文的長度(沒有添加位以前的明文長度)以64位表示,附加於前面已添加過位的明文後,此時的明文長度正好是512位的倍數。與MD5不同的是SHA1的原始報文長度不能超過2的64次方,另外SHA1的明文長度從低位開始填充。
經過添加位數處理的明文,其長度正好為512位的整數倍,然後按512位的長度進行分組(block),可以劃分成L份明文分組,我們用Y0,Y1,……YL-1表示這些明文分組。對於每一個明文分組,都要重復反復的處理,這些與MD5是相同的。
對於512位的明文分組,SHA1將其再分成16份子明文分組(sub-block),每份子明文分組為32位,我們使用M[k](k= 0, 1,……15)來表示這16份子明文分組。之後還要將這16份子明文分組擴充到80份子明文分組,我們記為W[k](k= 0, 1,……79),擴充的方法如下。
W t = M t , 當0≤t≤15
W t = ( W t-3 ⊕ W t-8⊕ W t-14⊕ W t-16 ) <<< 1, 當16≤t≤79
SHA1有4輪運算,每一輪包括20個步驟(一共80步),最後產生160位摘要,這160位摘要存放在5個32位的鏈接變量中,分別標記為A、B、C、D、E。這5個鏈接變量的初始值以16進制位表示如下。
A=0x67452301
B=0xEFCDAB89
C=0x98BADCFE
D=0x10325476
E=0xC3D2E1F0
四.SHA1的4輪運算
SHA1有4輪運算,每一輪包括20個步驟,一共80步,當第1輪運算中的第1步驟開始處理時,A、B、C、D、E五個鏈接變量中的值先賦值到另外5個記錄單元A′,B′,C′,D′,E′中。這5個值將保留,用於在第4輪的最後一個步驟完成之後與鏈接變量A,B,C,D,E進行求和操作。
SHA1的4輪運算,共80個步驟使用同一個操作程序,如下:
A,B,C,D,E←[(A<<<5)+ ft(B,C,D)+E+Wt+Kt],A,(B<<<30),C,D
其中 ft(B,C,D)為邏輯函數,Wt為子明文分組W[t],Kt為固定常數。這個操作程序的意義為:
● 將[(A<<<5)+ ft(B,C,D)+E+Wt+Kt]的結果賦值給鏈接變量A;
● 將鏈接變量A初始值賦值給鏈接變量B;
● 將鏈接變量B初始值循環左移30位賦值給鏈接變量C;
● 將鏈接變量C初始值賦值給鏈接變量D;
● 將鏈接變量D初始值賦值給鏈接變量E。
SHA1規定4輪運算的邏輯函數如表8-2-2所示。
表8-2-2 SHA1的邏輯函數
輪 |
步驟 |
函數定義 |
輪 |
步驟 |
函數定義 |
1 |
0≤t≤19 |
ft(B,C,D)=(B·C)V(~B·D) |
3 |
40≤t≤59 |
ft(B,C,D)=(B·C)V(B·D)V(C·D) |
2 |
20≤t≤39 |
ft(B,C,D)=B⊕C⊕D |
4 |
60≤t≤79 |
ft(B,C,D)=B⊕C⊕D |
在操作程序中需要使用固定常數Ki(i= 0,1,2,……79),Ki的取值如表8-2-3所示:
表8-2-3 SHA1的常數K取值表
輪 |
步驟 |
函數定義 |
輪 |
步驟 |
函數定義 |
1 |
0≤t≤19 |
Kt=5A827999 |
3 |
40≤t≤59 |
Kt=8F188CDC |
2 |
20≤t≤39 |
Kt=6ED9EBA1 |
4 |
60≤t≤79 |
Kt=CA62C1D6 |
我們同樣舉一個例子來說明SHA1哈希算法中的每一步是怎樣進行的,比起MD5算法,SHA1相對簡單,假設W[1]=0x12345678,此時鏈接變量的值分別為A=0x67452301、B=0xEFCDAB89、C=0x98BADCFE、D=0x10325476、E=0xC3D2E1F0,那麽第1輪第1步的運算過程如下。
(1) 將鏈接變量A循環左移5位,得到的結果為:0xE8A4602C。
(2) 將B,C,D經過相應的邏輯函數:
(B&C)|(~B&D)=(0xEFCDAB89&0x98BADCFE)|(~0xEFCDAB89&0x10325476)=0x98BADCFE
(3) 將第(1)步,第(2)步的結果與E,W[1],和K[1]相加得:
0xE8A4602C+0x98BADCFE+0xC3D2E1F0+0x12345678+0x5A827999=0xB1E8EF2B
(4) 將B循環左移30位得:(B<<<30)=0x7BF36AE2。
(5) 將第3步結果賦值給A,A(這裏是指A的原始值)賦值給B,步驟4的結果賦值給C,C的原始值賦值給D,D的原始值賦值給E。
(6) 最後得到第1輪第1步的結果:
A = 0xB1E8EF2B
B = 0x67452301
C = 0x7BF36AE2
D = 0x98BADCFE
E = 0x10325476
按照這種方法,將80個步驟進行完畢。
第四輪最後一個步驟的A,B,C,D,E輸出,將分別與記錄單元A′,B′,C′,D′,E′中的數值求和運算。其結果將作為輸入成為下一個512位明文分組的鏈接變量A,B,C,D,E,當最後一個明文分組計算完成以後,A,B,C,D,E中的數據就是最後散列函數值。
SHA1算法原理