Hash函數
基本形式:
hash函數將任意長的報文M映射爲定長的hash碼h,hash碼也稱爲報文摘要,具有錯誤檢驗能力。
基本性質:
- 單向性:由Hash碼不能得出相應的報文。
- 抗弱碰撞性:不能找到與給定報文具有相同Hash值的另一個報文,保證消息不會僞造。
- 抗強碰撞性:Hash值應該較長
典型的Hash算法
典型的M-D結構,將明文劃分爲明文塊,再進入到壓縮函數處理,輸出定長的密文(摘要)
SHA算法
SHA算法採用迭代型Hash函數的一般結構,輸入長度不超過264bit,輸入的消息按照512bit的塊進行處理,產生160位的消息摘要。
消息填充
填充報文的目的是使報文長度與448mod512同餘,即報文的最後的一部分只需要被填充到448位即可,512 - 448 = 64,這最後64位存放報文長度。其中填充位數在1到512之間(注意沒有0,也就是說一個長爲448位的明文,需要再填充512位)。
初始化緩衝區
算法使用了160位長度的緩衝區以存儲中間結果和最終的消息摘要,緩衝區表示爲5個32位長的寄存器A、B、C、D、E,每個寄存器都以big-ebdian方式存儲數據,即字的最高有效字節存於低地址字節位置。
緩存器初值爲(16進製表示):
算法主循環
每次以塊(512位)爲單位對消息進行壓縮處理,將512位的明文分組劃分爲16個子明文分組每個明文分組32位,之後經過壓縮函數處理,整體循環的次數爲填充後報文的分組數,即有多少分組就循環多少次。
- 壓縮函數處理:
壓縮函數有4輪處理過程,也就是經過4輪函數(f1,f2,f3,f4)處理,每一輪函數由20步迭代組成,每輪的輸入爲當前處理的消息塊mi導出的32位數據和緩衝區ABCDE的當前值,輸出覆蓋在對應的緩衝區,第四輪的輸出在與第一輪的輸入進行異或運算,得到壓縮函數的輸出。
因爲每一輪函數經過20步迭代,所以壓縮函數總共由80步迭代組成,每一步迭代的運算形式爲 :
A = (E + f(B,C,D) + (A << 5)+Wt + Kt)mod 232
B = A
C = B<<30
D = C
E = D
ABCDE就是對應的緩衝區中的值,f爲函數,<<爲左移, Wt 爲當前512位的消息塊導出的32位的數據,t爲迭代步數,Kt加法常量。
其中函數f輸入爲32*3=96位,輸出爲32位,輸入值每個函數都不同
每一步使用的Kt加法常量對應4輪處理只有4個取值
現在這裏存在一個問題!:每一步都使用512位報文分組中導出的32位數據,但是一共有20 * 4 = 80步迭代,80大於512 / 32 = 16,所以要將16個32位的數據(M0 ~ M15)擴展爲80個32位的字(M0 ~ M79)前16步迭代直接取輸入消息塊的16個相應的數據(Wt = Mt),後面64步迭代中Wt的值等於前4個Wt值異或後循環左移一位的結果。
具體的計算方式爲:
Wt = Mt ,0 <= t <=15
Wt = (Wt-3 ⊕ Wt-8⊕Wt-14⊕Wt-16 ) <<1 ,16 <= t <=79
輸出
對第一個512位分組執行完壓縮函數處理後繼續對下一個512位的分組重複4輪,每輪20次f1,f2,f3,f4操作,緩衝區中的值作爲下一個明文分組的輸入重複該過程,直到最後一個512位分組結束。
所有的消息塊處理結束後,將緩衝區A、B、C、D、E中最後生成的數據合併得到一個32 * 5 = 160位的數據,這就是SHA摘要。