Md5

MD5 - 如果消息恰好是 64 位塊大小的消息會發生什麼?

  • August 15, 2017

根據RFC 1321,在我們收到消息後,如果消息大小小於 64 字節,我們將附加一個 0x80 和消息長度 + 零,直到它為 64 位,然後生成摘要。

問題是精確的 64 字節會發生什麼?基於規格:

始終執行填充,即使消息的長度已經與 448 一致,模 512。

但這怎麼可能?

你不能附加長度和其他東西嗎?如果它是例如 128 字節,那麼我認為 64 字節消息摘要將與 128 位摘要相同?

填充可以表示如下:

  1. 附加一點值 1。
  2. 追加值 0 的 0 到 511 位。此處要追加的位數必須使得填充後的總長度是 512 的倍數。
  3. 附加消息長度的編碼(不計算填充位)。該編碼的大小總是正好為 64 位。

因此,如果您的輸入大小為 448 位,則:

  1. 添加值為 1 的位後,總長度為 449 位。
  2. 您將需要精確添加 511 位值 0。否則,最終長度不會是 512 的倍數。有了這些額外的 511 位,長度現在是 960 位。
  3. 使用長度編碼,大小現在是 960 + 64 = 1024,這確實是 512 的倍數。

然後將填充的輸入分成 512 位的塊,按適當的順序處理。

RFC 中關於長度正好等於 448 的句子旨在闡明該過程,因為始終添加值 1 的額外位。那一點不是可選的。


形式上,MD5 將比特序列作為輸入。然而,在大多數情況下,我們只對字節序列進行雜湊處理。換句話說,輸入長度將始終是 8 的倍數。填充過程,當用字節表示時,變為:

  1. 附加一個字節的 value 0x80
  2. 附加 0 到 63 個字節的 value 0x00。此處要附加的字節數必須是填充後的總長度(以字節為單位)是 64 的倍數。
  3. 附加消息長度的編碼(不計算填充字節)。該編碼的大小始終恰好為 8 個字節。長度以比特表示,即它是字節長度的八倍。

然後將填充的輸入分成 64 字節的塊,按適當的順序處理。

這個填充過程與為比特定義的填充過程*完全相同。*它只是從面向字節的角度來表達的。

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