Md5
MD5 - 如果消息恰好是 64 位塊大小的消息會發生什麼?
根據RFC 1321,在我們收到消息後,如果消息大小小於 64 字節,我們將附加一個 0x80 和消息長度 + 零,直到它為 64 位,然後生成摘要。
問題是精確的 64 字節會發生什麼?基於規格:
始終執行填充,即使消息的長度已經與 448 一致,模 512。
但這怎麼可能?
你不能附加長度和其他東西嗎?如果它是例如 128 字節,那麼我認為 64 字節消息摘要將與 128 位摘要相同?
填充可以表示如下:
- 附加一點值 1。
- 追加值 0 的 0 到 511 位。此處要追加的位數必須使得填充後的總長度是 512 的倍數。
- 附加消息長度的編碼(不計算填充位)。該編碼的大小總是正好為 64 位。
因此,如果您的輸入大小為 448 位,則:
- 添加值為 1 的位後,總長度為 449 位。
- 您將需要精確添加 511 位值 0。否則,最終長度不會是 512 的倍數。有了這些額外的 511 位,長度現在是 960 位。
- 使用長度編碼,大小現在是 960 + 64 = 1024,這確實是 512 的倍數。
然後將填充的輸入分成 512 位的塊,按適當的順序處理。
RFC 中關於長度正好等於 448 的句子旨在闡明該過程,因為始終添加值 1 的額外位。那一點不是可選的。
形式上,MD5 將比特序列作為輸入。然而,在大多數情況下,我們只對字節序列進行雜湊處理。換句話說,輸入長度將始終是 8 的倍數。填充過程,當用字節表示時,變為:
- 附加一個字節的 value
0x80
。- 附加 0 到 63 個字節的 value
0x00
。此處要附加的字節數必須是填充後的總長度(以字節為單位)是 64 的倍數。- 附加消息長度的編碼(不計算填充字節)。該編碼的大小始終恰好為 8 個字節。長度以比特表示,即它是字節長度的八倍。
然後將填充的輸入分成 64 字節的塊,按適當的順序處理。
這個填充過程與為比特定義的填充過程*完全相同。*它只是從面向字節的角度來表達的。