應用密碼學

SHA-256

SHA-256 是比特幣的主力雜湊函數:餵給它任何資料,就會吐出固定的 256 位元(32 位元組)指紋。它屬於 SHA-2 家族,由 NSA 設計、NIST 於 2001 年標準化,至今在實務上仍未被攻破。

它的結構是 Merkle–Damgård。訊息會先被填補——附加一個 1 位元、接著補零、再加上 64 位元的訊息長度——填到 512 位元的倍數,切成 512 位元的區塊,每個區塊由一個壓縮函數吸收。該函數讓 256 位元的鏈結值(八個 32 位元字)通過 64 輪的模加法、位元旋轉、XOR,以及 Ch、Maj 與 Sigma 函數,輪常數則取自質數的立方根。最後的鏈結值即為雜湊值。

在比特幣中它以雙重形式出現,即 SHA-256d(x) = SHA-256(SHA-256(x)),用於區塊雜湊與交易 ID——部分原因是要削弱 Merkle–Damgård 固有的長度延伸弱點。挖礦就是在搜尋一個讓 SHA-256d 低於難度目標值的區塊標頭,而挖礦 ASIC 本質上就是一整排 SHA-256 電路。安全等級:約 256 位元的原像抗性與 128 位元的碰撞抗性,目前無已知的實際攻擊。

SHA-256d(x) = SHA-256(SHA-256(x))

像 SHA-256 這類純 Merkle–Damgård 雜湊存在長度延伸弱點:在已知 H(m) 與 m 長度的情況下,攻擊者無需知道 m 即可算出 H(m‖pad‖m')。比特幣的雙重雜湊與 HMAC 都能迴避此問題;Keccak/SHA-3 則因設計而天生免疫。