【问题标题】:Appending the message in MD5在 MD5 中附加消息
【发布时间】:2014-01-04 04:57:12
【问题描述】:

我正在尝试了解 MD5 哈希算法的工作原理,并且一直在阅读有关它的 Wikipedia article

在一个附加消息使得消息的长度(以位为单位)与 448 mod 512 一致后,一个应该是

append length mod (2 pow 64) to message

据我所知,这意味着在消息中附加 64 位来表示消息的长度。我对这是如何完成的有点困惑。

  1. 我的第一个问题是:这是原始未附加消息的长度,还是在将 1 后跟零附加后得到的长度?

  2. 我的第二个问题是:长度是字节吗?也就是说,如果我的消息是一个字节,我会在消息后面附加 63 个 0,然后是 1。或者如果消息是 10 个字节,那么我会在消息后面附加 60 个 0 和 1010。

【问题讨论】:

    标签: md5


    【解决方案1】:
    1. 未填充消息的长度。来自MD5 RFC,3.2:

      b 的 64 位表示(在 添加了填充位)附加到前一个的结果中 步。万一 b 大于 2^64,那么只有 使用 b 的低 64 位。 (这些位被附加为两个 32 位字和附加的低位字首先按照 以前的约定。)

    2. 长度以位为单位。请参阅 MD5 RFC,3.1:

      消息被“填充”(扩展),因此其长度(以位为单位)为 等于 448,模 512。也就是说,消息被扩展为 它仅比 512 位长的倍数少 64 位。 始终执行填充,即使消息的长度是 已经与 448 一致,模 512。

    MD5 规范比维基百科的文章要精确得多。如果您需要实现级别的详细信息,我总是建议您阅读 Wiki 页面上的规范。

    如果我的消息是一个字节,我会在消息后面附加 63 个 0,然后是 1。或者如果消息是 10 个字节,那么我会在消息后面附加 60 个 0 和 1010。

    不完全是。不要忘记始终附加在填充开头的强制性位值“1”。来自规范:

    填充执行如下:单个“1”位附加到 消息,然后附加“0”位,以便以位为单位的长度 填充的消息与 448 一致,模 512。总而言之,在 至少追加 1 位,最多追加 512 位。

    这个 MD5 的 reference C implementation(免责声明:我自己的)可能会有所帮助,它的编写目的是希望它易于理解。

    【讨论】:

    • 好的,如果原始消息是一位呢?在一个附加位 1 后跟零以达到 448 mod 512 的长度之后,那么在此之后出现的 8 位长度的 64 位表示是什么? (如果这有意义的话)。
    • 如果原始消息是一位长,那么长度的 64 位表示就是 1。如果是一个字节,那么它将是 8 的 64 位表示。至于64位整数的编码,它将是小端(较低的内存地址包含值的租约有效部分)。
    • 如果是 1 字节(8 位),那么 64 位表示将是 1000? (所以 1000 后面跟着 60 个 0)
    • 如果您指的是整数表示(而不是内存表示),那听起来是对的。
    • 好的,有道理。感谢您向我解释。
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2013-01-01
    相关资源
    最近更新 更多