Hash
NIST 範例顯示 SHA512-256 的塊內容中的額外十六進製字元
我最近試圖更好地理解SHA-512/256 算法,在這個 NIST 範例中,他們使用單詞“abc”作為輸入。在 Block Contents 中,它顯示了預期的十六進制
616263
(abc),為什麼它後面直接跟0x80
and0x18
在最後?Block Contents: W[ 0] = 6162638000000000 W[ 1] = 0000000000000000 W[ 2] = 0000000000000000 W[ 3] = 0000000000000000 W[ 4] = 0000000000000000 W[ 5] = 0000000000000000 W[ 6] = 0000000000000000 W[ 7] = 0000000000000000 W[ 8] = 0000000000000000 W[ 9] = 0000000000000000 W[10] = 0000000000000000 W[11] = 0000000000000000 W[12] = 0000000000000000 W[13] = 0000000000000000 W[14] = 0000000000000000 W[15] = 0000000000000018
我意識到零是填充,但是,這是我不理解的存在
0x80
。0x18
它是編碼為大端序的 SHA-512 的字節填充,簡單地說
- 添加位
1
,這是0x80
乞求部分的最後一個- 填零
- 然後在最後添加 128 位 big-endian 中的大小。0x18 是 24 個字節,用於 3 個字元。
- 更正式;
NIST FIPS 180-4第 13 頁將 SHA-512 的填充方案定義為:
假設消息的長度, $ M $ , 是 $ \ell $ 位。將該位附加
1
到消息的末尾,然後是 $ k $ 零位,其中 $ k $ 是方程的最小非負解 $$ \ell + 1 + k \equiv 896 \bmod 1024 $$
- 你的箱子適合一個街區。
您的郵件大小是 $ \ell =24 $ 比
$$ 24 + 1 + k \equiv 896 \bmod 1024 $$求解最小 $ k = 896-24-1 = 871 $ . 因此填充的消息是
$$ \text{padded message } = \overbrace{M}^{24-bit} \mathbin| \overbrace{1}^{1-bit} \mathbin| \overbrace{000\cdots 000}^{871-bit; 0s} \mathbin| \overbrace{00000000\cdots00011000}^{128-\text{bit binary encoded length } \ell} $$