我一直在消息摘要领域进行一些初步研究。特别是加密散列函数(例如 MD5 和 SHA-1)的冲突攻击,例如Postscript 示例和X.509 证书副本。
据我所知,在 postscript 攻击的情况下,生成了特定数据并将其嵌入到 postscript 文件的标题中(在渲染过程中被忽略),这导致 md5 的内部状态处于修改后的措辞文档的最终 MD 值与原始 postscript 文件相同。X.509 采用了类似的方法,将数据注入证书的注释/空白部分。
好的,这是我的问题,我似乎找不到任何人问这个问题:
为什么不将仅消耗的数据的长度作为最终块添加到 MD 计算中?
在 X.509 的情况下 - 为什么将空格和注释作为 MD 的一部分考虑在内?
诸如以下之一的简单过程是否不足以解决建议的碰撞攻击:
- MD(M + |M|) = xyz
- MD(M + |M| + |M| * magicseed_0 +...+ |M| * magicseed_n) = xyz
在哪里 :
- M : 是消息
- |M| : 消息的大小
- MD :是消息摘要函数(例如:md5、sha、whirlpool 等)
- xyz : 是消息 M 和 |M| 的实际消息摘要值的配对。<M,|M|>
- magicseed_{i}:是一组随机值,由种子根据添加大小之前的内部状态生成。
该技术应该有效,因为迄今为止所有此类碰撞攻击都依赖于向原始消息添加更多数据。
简而言之,生成碰撞消息所涉及的难度级别如下:
- 它不仅生成相同的MD
- 但也是可理解的/可解析的/兼容的
- 并且与原始消息的大小相同,
如果不是几乎不可能的话,也是非常困难的。有没有讨论过这种方法?任何指向论文等的链接都会很好。
进一步的问题:对于从 U 中随机选择的散列函数 H,公共长度的消息冲突的下限是多少,其中 U 是通用散列函数的集合?
是 1/N(其中 N 是 2^(|M|))还是更大?如果它更大,则意味着有超过 1 条长度为 N 的消息将映射到给定 H 的相同 MD 值。
如果是这样的话,找到这些其他消息有多实用?蛮力将是O(2 ^ N),有没有一种时间复杂度低于蛮力的方法?