Hash

無填充的 SHA-256 壓縮函式

  • March 17, 2022

查看空輸入(512 位)的範例,它將作為輸入:

輸入(十六進制):0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

因為它正好是 512 位,所以沒有分割也沒有填充。但是從線上計算器或 golang 程式碼中,我將獲得 null 輸入的 sha-256 雜湊為:

線上計算器輸出(十六進制):f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b

但是,在幾個庫中,例如kobigurkSCALA MAMBA等,預期值應該是:

庫(十六進制):da5698be17b9b46962335799779fbeca8ce5d491c0d26243bafef9ea1837a9d8

我將空輸入精確地選擇為 512 位,沒有填充。可能是什麼問題呢?

簡短的回答;

您正在混合壓縮函式和雜湊函式。兩個頁面/庫在它們的上下文中都是正確的!


擴展答案

SHA-256 像其他雜湊算法一樣總是被填充,它在NIST.FIPS.180-4中定義

假設消息的長度 $ M $ ,以位為單位, $ \ell $ 是位。將位附加1到消息的末尾,後跟k零位,其中k是方程的最小非負解 $$ \ell +1 + k \equiv 448 \bmod 512 $$然後追加等於數字的64位塊 $ \ell $ 使用二進製表示

所以 SHA-256 中的 512 個零位將有 447 個零( $ k $ 部分);

$$ \text{Padded_Message} =\underbrace{\texttt{000…00}}{512-zeros}||\texttt{1}||\underbrace{\texttt{000…00}}{447-zeros}||\underbrace{\texttt{leng encoding}}_{64-bit} $$

如果您真的想測試一些輸入,請確保它們在密碼算法驗證程序 - 雜湊函式中定義的 NIST 測試向量上是正確的

對於填充,像往常一樣,與使用者無關。庫為使用者處理填充。

因為它正好是 512 位,所以沒有分割也沒有填充。但是從線上計算器或 golang 程式碼中,我將獲得 null 輸入的 sha-256 雜湊為:

如上所述,填充總是被定義的。它是 SHA-256 雜湊算法的一部分。

您的輸入不是空輸入,而是 512 位零輸入。NIST 提供長度為零的測試向量,其結果為

Len = 0

消息 = 00

MD = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

在sha256algorithm.com上測試您的輸入會產生

f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b

我也在一些 NIST 測試向量上測試了這個頁面。

您提供的SCALA MAMBA提到的連結:

輸出:壓縮輸入塊後的連結值(與將返回的摘要格式相同)

重要提示:這些不是完整 SHA-256 雜湊函式的測試向量,因為填充規則被忽略

這是第一個壓縮函式的輸出。如果您在第 164 步停止,這可以在sha256algorithm.com上進行驗證。將滑鼠放在初始值上,您將獲得十六進制值;

da5698be17b...

這在另一個連結上是相同的;作為sha256 壓縮測試向量給出。

請記住,如果需要,壓縮函式的輸出是下一個壓縮函式的初始值。如果不需要,則它是 SHA-256 的輸出。給出了第一個初始值;

這些詞代表前 64 個素數的立方根小數部分的前 32 位

儘管這是心理上的,但作為一個無所謂的我的袖子號碼。

引用自:https://crypto.stackexchange.com/questions/99152