1. 程式人生 > >SHA1演算法原理【轉】

SHA1演算法原理【轉】

轉自:https://www.cnblogs.com/scu-cjx/p/6878853.html

一.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中的資料就是最後雜湊函式值。