1. 程式人生 > >SHA1算法原理

SHA1算法原理

其余 取值 意義 重復 比較 adc xe8 還要 記錄

一.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算法原理