1.定義8個32位常量
h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19
2.再定義乙個k的32位整形陣列,陣列大小為64
k[0..63] :=
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
3.將需要編碼的檔案或字元(代表所有的二進位制格式)折分為n個512bit大小的塊,
4.補齊上述二進位制檔案,比如原檔案可能是512bit的整數倍,也可能不是512格式的整數倍
補齊的二進位制填充值為:
a.第乙個bit為1
b.然後加入k個0,k的值取決於最後乙個塊的大小,k>=0,且使得填入k個0之後,最後乙個塊達到448bit
c.加入原始塊的長度,用64位big-endian表示
加入填充值後,二進位制檔案為512bit的整數倍
注意,如果原檔案最後乙個塊大於512-1-64位,則多填入0,使用總塊數+1,填充的1位於倒數第二個塊內,填充的0位於最後兩個塊內,原始長度位於最後乙個塊內
5.對每乙個塊(512bit)進行如下運算:
注意:以下的運算特指單個塊(512位),以第乙個塊為例
定義乙個w陣列,大小為64個元素,每個元素為32bit,w[0..63]
w[0..15]為該塊的原始資料,即將原塊折分為16*32的16個32位小塊,存放入w[0..15]中
w[16..64]的運算方式為:
for i from 16 to 63
s0 := (w[i-15] rightrotate 7) xor (w[i-15] rightrotate 18) xor(w[i-15] rightshift 3)
s1 := (w[i-2] rightrotate 17) xor (w[i-2] rightrotate 19) xor(w[i-2] rightshift 10)
w[i] := w[i-16] + s0 + w[i-7] + s1
定義8個32位值a-h
a := h0
b := h1
c := h2
d := h3
e := h4
f := h5
g := h6
h := h7
for i from 0 to 63
s0 := (a rightrotate 2) xor (a rightrotate 13) xor(a rightrotate 22)
maj := (a and b) xor (a and c) xor(b and c)
t2 := s0 + maj
s1 := (e rightrotate 6) xor (e rightrotate 11) xor(e rightrotate 25)
ch := (e and f) xor ((not e) and g)
t1 := h + s1 + ch + k[i] + w[i]
h := g
g := f
f := e
e := d + t1
d := c
c := b
b := a
a := t1 + t2
h0 := h0 + a
h1 := h1 + b
h2 := h2 + c
h3 := h3 + d
h4 := h4 + e
h5 := h5 + f
h6 := h6 + g
h7 := h7 + h
這樣第乙個塊的h0-h7即運算完畢,然後使用這些值參與第二個塊的運算,由此可以看出,後乙個塊的值要依賴於前乙個塊的運算結果,補位的串和長度串只參與最後一次塊運算
在運算完畢所有塊之後:
將h0-h7連起來,即為8*32=256位的二進位製碼,即為最終結果
在我們的專案中,使用到了一種sha-256的改進演算法,詳見:sha-256演算法改進策略
SHA 256演算法流程
sha 256 輸入訊息 m 輸出訊息 256位 bit hash值 步驟 訊息填充 m的長度 mod 512 r,考慮r r為輸入訊息長度按512bit進行分組後,最後一組的長度 系統給出8個32位暫存器 a,b,c,d,e,f,g,h,其初始值分別取自8個素數 2,3,5,7,11,13,17,...
SHA 256演算法改進策略
在我之前的文章中理了一下sha 256演算法的實現過程 為什麼要對其改進呢?先來看一下如何加密防刷 使用sha 256可以針對原始檔生成加密key,為乙個256位二進位制格式,表述為64位16進製制的字串格式,可以用於對網路鏈結中的核心引數進行加密處理,做法是 選用幾個核心引數,連成乙個源字串,然後...
雜湊函式 SHA1和SHA256演算法
sha2演算法是對sha1演算法的繼承。區別在於兩者的構造和簽名長度不同。sha 1通過4輪運算 每輪20步,共80步 將長度不超過264的輸入壓縮成為160bit的訊息摘要。初始化md緩衝區,需要160位來存放雜湊函式的初始變數 中間摘要和最終摘要。需要5個32位的暫存器。sha 1的框圖 sha...