“長度擴展攻擊”維基百科頁面範例中的填充是否錯誤?
以下資訊總結了發布此問題時頁面上提供的相關資訊。
提供的參數是
- 秘密長度:14
- 消息:count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo
- 原始簽名是 6d5f807e23db210bc254a28be2d6759a0f5f5d99
- 該頁面沒有明確說明,但我們可以推斷範例中使用的雜湊算法是 SHA-1(使用 SHA-1 會產生範例中提供的新簽名,0e41270260895979317fff3898ab85668953aaa2)
擴展消息(在頁面上稱為“新數據”,此處重新格式化以刪除換行符和空格)列出為:count=10&lat=37.351&user_id=1&long=-119.827&waffle=eggo\x80\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x02\x28&waffle=領主
填充應該產生一個以比特為單位的消息長度(不包括擴展),它是 512 的倍數。
計算“新數據”中的位數(不包括副檔名):
- 消息長度(位)= 55 * 8 = 440
- 以比特為單位的秘密長度 = 14 * 8 = 112
- 填充位:58 * 8 = 464
- 總長度(不包括擴展)= 1016
根據上面的計算,有 8 位失去,所以“新數據”應該包括另一個 \x00。我的計算/推理/理解錯了嗎?
以 1 開頭的 50 字節填充,其餘為 0(每個 \ 是一個字節)
\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00
編碼大小的填充的 8 字節大小部分(SHA-1 在使 8 字節的填充中具有 64 位長度編碼)
\x00\x00\x00\x00\x00\x00\x02\x28
0x228 = 552
我們有 69 字節的消息大小。那是對的。55 字節的消息和 14 字節的秘密組成一個 69 字節的消息。
以位為單位的消息構成 552 位,這些位超過一個具有 512 位塊大小的 SHA-1 塊。所以總的來說,我們需要 1024 位用於散列,兩個塊。為消息大小保留 64 位。這留下了 960 位。現在減去 552 位的消息大小,我們有 408 位。所以我們需要 51 個字節的填充,
0x80
但我們有 50 個,即 $ \color{red}{\text{1-byte is missing. Your calculations are correct}} $ .我們本應該;
$$ \underbrace{secret}{14-byte}\mathbin|\underbrace{message}{55-byte}\mathbin|\underbrace{100\ldots00}{51-byte \text{ padding 10 part}}\mathbin|\underbrace{000\ldots 0228}{8-byte \text{ length part}} $$
SHA-1 填充規則
附加位 $ \texttt{1} $ 到消息中,例如通過添加字節 $ \texttt{0x80} $ 如果消息長度是 8 位的倍數,即面向字節。
附加 $ 0 \leq k < 512 $ 零位,使得生成的消息長度(以位為單位)與$$ −64 \equiv 448 \pmod{512} $$
附加原始消息長度,作為 64 位大端整數。因此,總長度是 512 位的倍數。
真正的擴展;
&waffle=liege
維基百科在附加後不顯示所需的填充。這是 13 個字節的文本,消息的大小為 $ 1024+13*8= 1128 $ . 因此,我們將需要 3 個塊來進行總共 1536 位的擴展。這將是新的 64 位編碼,這將需要 344 位 $ 1000.000 $$$ \underbrace{secret}{14-byte}\mathbin|\underbrace{message}{55-byte}\mathbin|\underbrace{100\ldots00}{51-byte \text{ padding 10 part}}\mathbin|\underbrace{000\ldots 0228}{8-byte \text{ length part}} \mathbin|\underbrace{\text{&waffle=liege}}{13-byte \text{ extended message}} \mathbin|\underbrace{100\ldots00}{43-byte \text{ padding 10 part}} \mathbin|\underbrace{000\ldots 0468}_{8-byte \text{ extended length part}} $$
另一種觀點;
$$ \text{SHA-1}(\text{secret_key}\mathbin|\text{message}\mathbin| \text{pad1}\mathbin| \text{appended_data} \mathbin| \text{pad2}) $$