iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0

「SHA SHA, SHA SHA SHA SHA」


SHA-256是SHA-2家族裡輸出位元為256的雜湊函數,
也是比特幣區塊鏈所使用的雜湊函數。
我們來看他怎麼運作的。

SHA-256

1.填充 PADDING

第一件事情是補足位數,也就是除了原先有的訊息,
我們要把訊息後面加上1後再加上一堆0,
直到總長度是512位元的倍數減掉64位元。
而被減掉的那64位元,用來寫上原訊息的位元長度。

2. 初始值 INITIAL VALUES

設定初始值,初始值是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]。

3. 擴散

每512位元為一個區塊。
將填充後的訊息每32位元分成一堆,稱為word
每個區塊會有16個word。
在這16個word後面,我們要再加上48個word。

這48個word的生成方式如下:
for i from 16-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

進行完以上步驟後,我們會有64個word,其中16個是原始的,48個是加上去的。

4. 壓縮

先初始化向量(a, b, c, d, e, f, g, h)等於當前的雜湊值(h0, h1, h2, h3, h4, h5, h6, h7)

for i from 0 - 63

  • S1 = (e rightrotate 6) XOR (e rightrotate 11) XOR (e rightrotate 25)
  • choose = (e and f) XOR ((not e) and g)
  • t1 = h + S1 + choose + K[i] + W[i]
  • 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
  • h = g
  • g = f
  • f = e
  • e = d + t1
  • d = c
  • c = b
  • b = a
  • a = t1 + t2

接著將將結果加上原本的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


上一篇
DAY 17- 雜湊函數 HASH
下一篇
DAY 19-數位簽章- DSA
系列文
學密碼學也猜不到你的手機密碼30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言