我一直在对消息摘要进行一些初步研究。特别是对加密哈希函数(如MD5和SHA-1)的冲突攻击,例如Postscript example和X.509 certificate duplicate。
从后记攻击的情况我可以看出,生成了特定的数据并嵌入postscript文件的标题中(在渲染过程中被忽略),这导致md5的内部状态变为如下状态:修改后的文档措辞将导致最终的MD值等同于原始的postscript文件。 X.509采用了类似的方法,通过在证书的注释/空白部分中注入数据。
好的,这是我的问题,我似乎找不到任何人提出这个问题:
为什么 ONLY 的长度不是作为MD计算的最后一个块而被消耗的数据?
在X.509的情况下 - 为什么将空白和评论作为MD的一部分考虑在内?
下列其中一个简单的过程不足以解决建议的碰撞攻击:
其中:
此技术应该有效,迄今为止所有此类碰撞攻击都依赖于向原始消息添加更多数据。
简而言之,生成碰撞消息所涉及的难度水平如下:
进一步的问题:对于从U中随机选择的散列函数H,共同长度的消息冲突的下界是什么,其中U是通用散列函数的集合?
是1 / N(其中N是2 ^(| M |))还是更大?如果它更大,则意味着有超过1条长度为N的消息将映射到给定H的相同MD值。
如果是这种情况,找到这些其他消息有多实用?暴力将是O(2 ^ N),是否有一种时间复杂度低于暴力的方法?
答案 0 :(得分:0)
不能代表其余的问题,但第一个问题相当简单 - 在散列过程的任何阶段(第1个区块,第N个区块,最后一个区块)将长度数据添加到md5的输入中更改输出哈希值。之后您无法从输出哈希字符串中检索该长度。从一开始就没有从另一个具有完全相同长度的字符串产生冲突也是不可想象的,所以说“原始字符串是17个字节”是没有意义的,因为冲突的字符串也可能是17个字节。
e.g。
md5("abce(17bytes)fghi") = md5("abdefghi<long sequence of text to produce collision>")
仍有可能。
答案 1 :(得分:0)
特别是在X.509证书的情况下,“注释”不是编程语言意义上的注释:它们只是具有OID的附加属性,表明它们将被解释为注释。证书上的签名被定义为整个tbsCertificate
('待签名'证书)结构的DER表示,其中包括所有附加属性。
哈希函数设计是非常深刻的理论,可能会更好地在the Theoretical CS Stack Exchange上提供。
正如@Marc指出的那样,只要可以修改比哈希函数的输出包含更多的比特,那么pigeonhole principle对于某些输入对必须存在冲突。由于加密哈希函数通常在其输入上designed to behave pseudo-randomly,因此冲突将倾向于均匀分布在可能的输入上。
编辑:将消息长度合并到散列函数的最后一个块中,相当于将之前所有内容的长度附加到输入消息中,因此不需要修改哈希函数本身就是这样做的;相反,将其指定为给定上下文中的使用的一部分。我可以看到这会使某些类型的碰撞攻击难以实现,因为如果你改变了消息长度,那么攻击所修改区域的“下游”字段会发生变化。但是,这不一定会妨碍X.509 intermediate CA forgery attack,因为tbsCertificate
的长度未被修改。