Cryptography 冲突攻击、消息摘要和可能的解决方案
我一直在做一些信息摘要方面的初步研究。特别是对加密散列函数(如MD5和SHA-1)的冲突攻击,如和 从postscript攻击中我可以看出,特定的数据被生成并嵌入到postscript文件的头中(在渲染过程中被忽略)这使md5的内部状态变为这样一种状态,即文档的修改措辞将导致最终MD值与原始postscript文件相等。 X.509采用了类似的方法,其中by数据被注入证书的注释/空白部分 好的,这是我的问题,我似乎找不到有人问这个问题:Cryptography 冲突攻击、消息摘要和可能的解决方案,cryptography,math,hash-collision,message-digest,Cryptography,Math,Hash Collision,Message Digest,我一直在做一些信息摘要方面的初步研究。特别是对加密散列函数(如MD5和SHA-1)的冲突攻击,如和 从postscript攻击中我可以看出,特定的数据被生成并嵌入到postscript文件的头中(在渲染过程中被忽略)这使md5的内部状态变为这样一种状态,即文档的修改措辞将导致最终MD值与原始postscript文件相等。 X.509采用了类似的方法,其中by数据被注入证书的注释/空白部分 好的,这是我的问题,我似乎找不到有人问这个问题: 为什么不将仅消耗的数据的长度作为最后一个块添加到MD计算中
如果是这样的话,找到这些其他信息有多实际?bruteforce是O(2^N),是否有一种时间复杂度低于bruteforce的方法?无法回答其余的问题,但第一个问题相当简单-在散列过程的任何阶段(第1个块、第N个块、最后一个块)向md5的输入添加长度数据只会更改输出散列。之后无法从输出哈希字符串中检索该长度。从一开始就不能从另一个长度完全相同的字符串中产生冲突也不是不可想象的,因此说“原始字符串是17字节”是没有意义的,因为冲突字符串也可能是17字节 e、 g
md5(“abce(17字节)fghi”)=md5(“abdefghi”)
仍然是可能的。无法回答其余的问题,但第一个问题相当简单-将长度数据添加到md5的输入中,在散列过程的任何阶段(第一个块、第n个块、最后一个块),只会更改输出散列。之后无法从输出哈希字符串中检索该长度。从一开始就不能从另一个长度完全相同的字符串中产生冲突也不是不可想象的,因此说“原始字符串是17字节”是没有意义的,因为冲突字符串也可能是17字节 e、 g
md5(“abce(17字节)fghi”)=md5(“abdefghi”)
仍然是可能的。特别是在X.509证书的情况下,“注释”不是编程语言意义上的注释:它们只是附加属性,带有一个OID,表示它们将被解释为注释。证书上的签名定义为在整个
tbsCertificate
(“待签名”证书)结构的DER表示之上,该结构包括所有附加属性
不过,散列函数设计是一个相当深入的理论,可能更好地应用于此
正如@Marc所指出的,只要修改的比特数比散列函数的输出所包含的比特数还多,那么对于某些输入对,就必须存在冲突。由于加密散列函数通常覆盖其输入,因此冲突将趋向于均匀分布在可能的输入上
编辑:将消息长度合并到散列函数的最后一个块将相当于将之前的所有内容的长度附加到输入消息,因此不需要修改散列函数来完成此操作;相反,将其指定为给定上下文中用法的一部分。我可以看出这会使某些类型的碰撞攻击更难实施,因为如果更改消息长度,攻击修改区域的“下游”字段会发生更改。但是,这并不一定会妨碍操作,因为未修改
tbsCertificate
的长度。对于X.509证书,具体而言,“注释”不是编程语言意义上的注释:它们只是附加属性,带有一个OID,指示它们将被解释为注释。证书上的签名定义为在整个tbsCertificate
(“待签名”证书)结构的DER表示之上,该结构包括所有附加属性
不过,散列函数设计是一个非常深入的理论,可能会更好
md5("abce(17bytes)fghi") = md5("abdefghi<long sequence of text to produce collision>")