SHA 256演算法實現過程

2021-08-21 02:52:29 字數 2936 閱讀 2494

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...