【问题标题】:Collision Attacks, Message Digests and a Possible solution碰撞攻击、消息摘要和可能的解决方案
【发布时间】:2011-01-14 05:40:28
【问题描述】:

我一直在消息摘要领域进行一些初步研究。特别是加密哈希函数如 MD5 和 SHA-1 的碰撞攻击,如 Postscript exampleX.509 certificate duplicate

据我所知,在 postscript 攻击的情况下,生成了特定数据并将其嵌入到 postscript 文件的标题中(在渲染过程中会被忽略),这导致 md5 的内部状态达到这样的状态修改后的文件措辞将导致最终的 MD 值与原始 postscript 文件相同。 X.509 采用了类似的方法,将数据注入证书的注释/空白部分。

好的,这是我的问题,我似乎找不到任何人问这个问题:

  1. 为什么不将ONLY正在消耗的数据的长度作为最终块添加到 MD 计算中?

  2. 对于 X.509 - 为什么将空格和 cmets 作为 MD 的一部分考虑在内?

诸如以下之一的简单过程是否足以解决所提议的碰撞攻击:

  1. MD(M + |M|) = xyz
  2. MD(M + |M| + |M| * magicseed_0 +...+ |M| * magicseed_n) = xyz

在哪里:

  1. M : 是消息
  2. |M| : 消息大小
  3. MD : 是消息摘要函数(例如:md5、sha、whirlpool 等)
  4. xyz : 是消息 M 和 |M| 的实际消息摘要值的配对。
  5. magicseed_{i}:是使用种子根据添加大小之前的内部状态生成的一组随机值。

这项技术应该可以工作,因为迄今为止所有此类碰撞攻击都依赖于向原始消息添加更多数据。

简而言之,生成碰撞消息所涉及的难度级别如下:

  1. 不仅生成相同的MD
  2. 但也是可理解/可解析/兼容的
  3. 并且与原始消息的大小相同,

如果不是几乎不可能的话,也是非常困难的。有没有讨论过这种方法?任何指向论文等的链接都会很好。

进一步的问题:对于从 U 中随机选择的散列函数 H,公共长度的消息冲突的下限是多少,其中 U 是通用散列函数的集合?

是 1/N(其中 N 是 2^(|M|))还是更大?如果它更大,则意味着有不止 1 条长度为 N 的消息将映射到给定 H 的相同 MD 值。

如果是这样,找到这些其他消息的实用性如何? bruteforce 将是 O(2^N),有没有一种时间复杂度低于 bruteforce 的方法?

【问题讨论】:

  • 由于这是一个研究/理论问题,您可能希望将其迁移到cstheory.stackexchange.com
  • 只针对前 5 个备用站点,不幸的是 ctheory 不是其中之一。不过,我有一半的答案。

标签: cryptography math hash-collision message-digest


【解决方案1】:

不能回答剩下的问题,但第一个问题相当简单——在散列过程的任何阶段(第一个块、第 N 个块、最后一个块)将长度数据添加到 md5 的输入中更改输出哈希。之后您无法从输出哈希字符串中检索该长度。也不难想象,从一开始就不能从另一个长度完全相同的字符串产生冲突,所以说“原始字符串是 17 个字节”是没有意义的,因为冲突的字符串也可能是 17 个字节。

例如

md5("abce(17bytes)fghi") = md5("abdefghi<long sequence of text to produce collision>")

还是可以的。

【讨论】:

    【解决方案2】:

    在 X.509 证书的情况下,“cmets”不是编程语言意义上的 cmets:它们只是带有 OID 的附加属性,表明它们将被解释为 cmets。证书上的签名被定义为整个 tbsCertificate(“待签名”证书)结构的 DER 表示,其中包括所有附加属性。

    不过,哈希函数设计是相当深入的理论,在 the Theoretical CS Stack Exchange 上可能会更好。

    不过,正如@Marc 指出的那样,只要可以修改的位多于散列函数的输出所包含的位,那么对于某些输入对,pigeonhole principle 就必须存在冲突。因为密码散列函数通常designed to behave pseudo-randomly 在其输入上,所以冲突将倾向于均匀分布在可能的输入上。

    编辑: 将消息长度合并到散列函数的最后一个块中相当于将之前所有内容的长度附加到输入消息中,因此无需修改哈希函数自己做这件事;相反,将其指定为给定上下文中用法的一部分。我可以看到这会使某些类型的碰撞攻击更难实施,因为如果您更改消息长度,则攻击修改的区域的“下游”字段会发生变化。但是,这并不一定会妨碍X.509 intermediate CA forgery attack,因为tbsCertificate 的长度没有被修改。

    【讨论】:

    • @Dominar:同样的构造适用于 X.509 案例,其中或多或少包含随机废话二进制字符串的属性可以合并到 tbsCertificate 中——大多数处理器将忽略无法识别的扩展,除非它们包含一个“必须理解”标志,并且该“必须理解”标志是证书中属性记录的一部分,因此攻击者当然不会设置该标志。
    • @Dominar:另外,鸽巢原理只是表明将数据长度显式合并到哈希中并不是万能的。
    • @Dominar:这相当于将消息长度附加到消息中,不是吗?因此,您不必修改散列函数本身的定义,只需修改它的用法。我可以看到这将如何使一些碰撞攻击更难实施:如果您更改消息长度,那么您正在操纵散列状态的输入“下游”会发生变化。这样的改变不会影响 X.509 攻击,因为 tbsCertificate 的长度没有改变——参见win.tue.nl/hashclash/rogue-ca 5.3 节。
    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2015-07-10
    • 2021-12-31
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多