「SHA SHA, SHA SHA SHA SHA」
SHA-256是SHA-2家族裡輸出位元為256的雜湊函數,
也是比特幣區塊鏈所使用的雜湊函數。
我們來看他怎麼運作的。
第一件事情是補足位數,也就是除了原先有的訊息,
我們要把訊息後面加上1後再加上一堆0,
直到總長度是512位元的倍數減掉64位元。
而被減掉的那64位元,用來寫上原訊息的位元長度。
設定初始值,初始值是2, 3, 5, 7, 11, 13, 17, 19開根號後的小數點後前32位元。
h0 = 0x6a09e667
h1 = 0xbb67ae85
h2 = 0x3c6ef372
h3 = 0xa54ff53a
h4 = 0x510e527f
h5 = 0x9b05688c
h6 = 0x1f83d9ab
h7 = 0x5be0cd19
還要儲存64個回合常數,
分別是前64個質數開三次方根後,小數點後前32位元的值,計做 K[0] 到 K[63]。
每512位元為一個區塊。
將填充後的訊息每32位元分成一堆,稱為word
每個區塊會有16個word。
在這16個word後面,我們要再加上48個word。
這48個word的生成方式如下:
for i from 16-63
進行完以上步驟後,我們會有64個word,其中16個是原始的,48個是加上去的。
先初始化向量(a, b, c, d, e, f, g, h)等於當前的雜湊值(h0, h1, h2, h3, h4, h5, h6, h7)
for i from 0 - 63
接著將將結果加上原本的h,之後進行下一個區塊
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放在一塊(concatenate),就是最終結果。
以上就是 SHA-256 的演算法內容,是不是超級複雜的。
我個人覺得他有點像 AES 的那種位元調換來調換去的那種感覺,
不過複雜了許多。
所以可以想到的是電腦跑的速度有多快了,
每一次礦工在進行運算時,
都要跑遍以上的所有步驟,然後運算過超級多次之後才有可能冒出一個符合條件的,
而且還有高機率被別人搶走。
看完詳細的介紹,再來看維基百科的圖,大概就能理解了(吧?)。
圖片來源:
https://medium.com/biffures/part-5-hashing-with-sha-256-4c2afc191c40
https://zh.wikipedia.org/wiki/SHA-2