Cryptography 冲突攻击、消息摘要和可能的解决方案

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计算中

我一直在做一些信息摘要方面的初步研究。特别是对加密散列函数(如MD5和SHA-1)的冲突攻击,如和

从postscript攻击中我可以看出,特定的数据被生成并嵌入到postscript文件的头中(在渲染过程中被忽略)这使md5的内部状态变为这样一种状态,即文档的修改措辞将导致最终MD值与原始postscript文件相等。 X.509采用了类似的方法,其中by数据被注入证书的注释/空白部分

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

  • 为什么不将仅消耗的数据的长度作为最后一个块添加到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 |的实际消息摘要值的配对
  • magicseed_{i}:是根据添加大小之前的内部状态,使用种子生成的一组随机值
  • 这项技术应该可以工作,因为到目前为止,所有此类碰撞攻击都依赖于向原始消息添加更多数据

    简言之,生成冲突消息所涉及的困难程度如下:

  • 它不仅生成相同的MD
  • 但也是可理解/可分析/兼容的
  • 并且与原始消息的大小相同
  • 这是非常困难的,如果不是几乎不可能的话。有没有讨论过这种方法?任何文件等的链接都很好

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

    它是1/N(其中N是2^(| M |))还是更大?如果它更大,则意味着有超过1条长度为N的消息将映射到给定H的相同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>")