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