計算要附加到消息的零位的數量
從FIPS 180-3
假設消息的長度, $ M $ , 是 $ l $ 位。附加位 $ 1 $ 到消息的末尾,然後是 $ k $ 零位,其中 $ k $ 是方程的最小非負解 $ l + 1 + k \equiv 448 \mod 512 $ .$$ … $$例如,(8 位 ASCII)消息“abc”的長度為 $ 8 \times 3 = 24 $ ,所以消息被填充了一位,然後 $ 448 − (24 + 1) = 423 $ 零位$$ … $$.
該範例僅適用於 $ 0 \leq M < 448 $ ,所以我想出了這個計算公式 $ k $ .
$$ k = 448 - (l + 1) + 512 \cdot \left\lfloor \frac{l + 64}{512} \right\rfloor $$ 或更短
$$ k = 447 - l + 512 \cdot \left\lfloor \frac{l + 64}{512} \right\rfloor $$ 這是最短/最高效的計算方法嗎 $ k $ ?
如果您有一個整數模運算符的實現,那麼
$$ k = (447 - l) \bmod 512 $$ 應該是正確的解決方案。如果您的模運算符可以返回否定結果,請執行以下操作:
$$ k = ((447 - l) \bmod 512 + 512) \bmod 512 $$ 這似乎比使用您的分區和地板更簡單。
也就是說,您實際上並不需要填充的零位數,但您需要知道要散列多少 512 位(例如 64 字節)塊。然後這些將由以下人員填寫:
- 數據
- 一個 1 位
- 一些 0 位(在 0 和 511 之間,用於填充塊)
- 長度,編碼為 64 位數字。
我們需要足夠的( $ b $ ) 塊為數據和長度(和一個 1 位)留出空間:
$$ b = \left\lceil \frac{l + 1 + 64}{512} \right\rceil $$ 如果您只散列整個字節中的數據(像往常一樣),則公式變為
$$ b = \left\lceil \frac{l_8 + 1 + 8}{64} \right\rceil, $$ 和 $ l_8 = \frac l8 $ 數據的長度(以字節為單位)。