nist目前支持的sha運算,sha1系列,輸出mac160bit。算法
sha2系列,支持sha2-224,sha2-256,sha2-384,sha2-512,sha2-512/224,sha2-512/256安全
sha3系列,支持sha3-224,sha3-256,sha3-384,sha3-512app
sha1和sha2系列的算法,支持最大的message長度,block size的大小,輸出digest的size。3d
sha1和sha2的算法相似,都分爲preprocessing和迭代運算兩部分。NIST的標準爲FIPS 180-4blog
1) preprocessing,padding message,將message分爲512,或者1024bit的整數倍。字符串
512bit的block,最後64bit表示message的長度,1024bit的block,最後128bit表示message的長度。input
2) 迭代運算,迭代開始init vector,Hstring
sha1,是5個32bit的word組成的向量,hash
512bit的block,是8個32bit的word組成的向量,it
1024bit的block,是8個64bit的word組成的向量。
迭代過程當中,存在a-f的8箇中間變量,由H初始化。
每一個block的數據被分爲64個或者80個word,在通過64輪或者80輪迭代,更新a-f這幾個中間變量。
輸出最終的a-f的中間變量的值做爲hash digest的值。
sha3系列算法,採用的engine內核不一樣於sha2,而是基於Keccak-p[b,nr]的置換-------sponge壓縮算法。
sponge壓縮算法,分爲absorb和squeeze兩部分,absorb進行數據的迭代壓縮,squeeze生成指定長度的digest。
sponge壓縮算法的輸入Sponge[f, pad(r, len(N)), r](N,d):
1) input string,能夠是byte流也能夠是bit流,注意sha3中的byte流和bit流的轉換,高低位置是相反的。0x80對應0b'0000_0001。
2) padding function,SHA3採用10*1的bit流的方式來padding。padding以後的string len是r的整數倍。
3) rate,r+c = b。
4) f,表示算法每次塊的處理長度,處理長度爲b。
sha3運算中的核心engine,Keccak-p[b, nr]其中b表示每次置換的bits的長度,NIST給出的標準只有七種選擇。25,50,100,200,400,800,1600。
由b的值能夠獲得兩個變量,w表示state的z軸,w = b/25。
l表示算法須要迭代的次數,l = log2w。
Keccak-p[b, nr]算法的輸入是一個三維的5*5*w的三維矩陣。每次的置換運算中,包括5個小的運算。
Keccak-p[b, nr]的算法流程:
Keccak-f系列的算法是Keccak-p算法中的一大類,其中nr = 12 + 2l,而sha3採用的Keccak算法正是該系列下的b = 1600的系列。
sha3算法的置換部分的engine爲Keccak-p[1600,24]。
sha3的算法表示,N表示輸入的最原始的bit字符串,d表示輸出的string的長度。而且規定c = 2d。
Keccak[c](N, d) = Sponge[Keccak-p[1600,24], pad 10*1, 1600-c](N, d)
sha3的其中四種運算,須要在M以後加01,以後padding。另外的shake運算,須要在M以後加1111。
其中各個算法中的r*8爲(能夠經過1600-2d)/8獲得:
總結:
sha3運算首先將input string pad 爲一個5*5 state,各個block塊,以1600bit分組,進行absort操做,每次調用Keccak算法24次。
以後進行squeezing操做。
sha3中的10*1的bit pading方法,對應到byte string中,表示爲:(其中q爲r - m/ mod r,r爲byte表示的長度)
針對nist approve的各個hash algm,他們的安全等級分別爲: