應用密碼學
Keccak-256
Keccak-256 是以太坊的預設雜湊函數——它是 KECCAK256 操作碼、地址衍生、函數選擇器以及 Solidity 中 keccak256() 背後的函數。它和 SHA-256 一樣輸出 256 位元,但建立在完全不同的原理上:海綿結構。
在海綿結構中,一個龐大的內部狀態(Keccak 為 1600 位元)被切成「速率」r 與「容量」c。吸收階段把 r 位元的訊息區塊 XOR 進狀態,每次之後施加 Keccak-f 置換——在 5×5×64 的位元陣列上進行 24 輪的 theta、rho、pi、chi 與 iota 步驟。所有輸入吸收完後,狀態被擠出以形成雜湊值。容量(Keccak-256 為 c = 512)決定安全等級,而此結構對長度延伸天生免疫。
關鍵陷阱:以太坊在 NIST 於 2015 年定案 SHA-3 之前就採用了 Keccak,而 SHA-3 更動了域分隔填補(SHA-3 在填補規則前附加位元 01,原始 Keccak 則沒有)。結果是以太坊的 keccak256「並非」NIST SHA3-256——兩者對相同輸入產生不同的雜湊值。Solidity 與工具刻意稱之為 keccak256 以標示此差異;把它叫成「SHA-3」是常見且會引發 bug 的錯誤。
keccak256(input) 不等於 SHA3-256(input)。唯一差別是一個域分隔填補位元組,卻使每個輸出都不同——這是跨工具、跨語言 bug 的常見來源。
另見