Hash

當結果始終相同時,為什麼在 SHA-2 填充中使用模數來表示全等?

  • April 17, 2018

我正在閱讀 SHA-2 算法,發現了這篇論文:https ://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf

在 5.2.1 節中,它討論了填充消息的公式。有些狀態之間存在一致性:

$$ \text{message length} + 1 + k $$ 和$$ 896 \pmod{1024} $$ 計算 $ k $ (零的數量)以下範例針對消息長度為 24 給出:

896-(24+1) = 871

我想知道為什麼 $ 896 \pmod{1024} $ 當結果始終不變時使用?為什麼不簡單地使用數字 896?

我們得到一個 $ \ell $ -bit 消息,我們試圖找到最小的非負數 $ k $ 這樣 $ \ell + 1 + k \equiv 896 \pmod{1024} $ . 這意味著我們正在努力尋找 $ k $ 這樣 $ \ell + 1 + k $ 是 896 加上 1024 的整數倍: $ \ell + 1 + k = 896 + n\cdot 1024 $ , 對於一些 $ n $ .

假設你有一條 895 位的消息, $ \ell = 895 $ . 一點填充,與 $ k = 0 $ 零,使其長度成為 1024 加 896 的倍數: $ 895 + 1 + 0 = 896 + 0\cdot 1024 $ .

假設你有一條 897 位的消息, $ \ell = 897 $ . 您可以添加以使其成為 1024 加 896 的倍數的最小填充量是 1023 位,其中 $ k = 1022 $ 零: $ 897 + 1 + 1022 = 896 + 1\cdot 1024 $ .

“1024 的倍數加 896”的另一種表達方式是“1024 的倍數減去 128 ”。 關鍵是我們添加了最小量的填充,它將填充一個 1024 位塊並留有空間以在末尾附加消息的長度作為 128 位整數 完整的填充輸入是

$$ m \mathbin\Vert 1 \mathbin\Vert 0^k \mathbin\Vert \operatorname{be128}(\ell) $$在哪裡 $ \operatorname{be128}(\ell) $ 是整數的 128 位大端編碼 $ \ell $ , 和 $ 0^k $ 是盡可能多的零,以使其成為 1024 位長的精確倍數。 我們想要填充消息中的 1024 位的精確整數倍,以便我們可以將其分成塊 $ b_1 \mathbin\Vert b_2 \mathbin\Vert \cdots \mathbin\Vert b_n $ 計算

$$ f(f(\dots f(f(\mathit{IV}, b_1), b_2)\dots), b_n), $$在哪裡 $ f $ 是在 512 位狀態和 1024 位塊上定義的內部壓縮函式,並且 $ \mathit{IV} $ 是標準的初始化向量。

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