【问题标题】:Is there any difference between md5 and sha1 in this situation?在这种情况下 md5 和 sha1 有什么区别吗?
【发布时间】:2023-12-01 10:20:01
【问题描述】:

众所周知

1.    if   ( md5(a)   == md5(b)   )
2.    then ( md5(a.z) == md5(b.z) )
3.    but  ( md5(z.a) != md5(z.b) )

点连接字符串的位置。

编辑---

在这里您可以找到ab
http://www.mscs.dal.ca/~selinger/md5collision/

查看这些链接:
hexpaste.com/qzNCBRYb/1 - 这是a.md5(a)."kutykurutty"
hexpaste.com/mSXMl13A/1 - 这是b.md5(b)."kutykurutty"

它们共享相同的 md5 哈希,但它们是不同的。但是您可以将这些字符串称为a'b',因为它们具有相同的md5。

--- 编辑

如果我们将所有 md5 更改为 sha1,第二行会发生什么?所以:

1.    if   ( sha1(c)   == sha1(d)   )
2.    then ( sha1(c.z) ?= sha1(d.z) )

我找不到两个具有相同 sha1 的不同字符串,这就是我问这个的原因。还有其他关于 sha1 的有趣“规则”吗?

【问题讨论】:

    标签: md5 theory sha1


    【解决方案1】:

    第一个语句只适用于非常具体的z,专门针对给定的ab 计算。确实可以生成 MD5 冲突,但这不是微不足道的 - 需要一些计算工作,当然你不能指望任何 z 都会这样做。

    目前 SHA-1 被认为是加密安全的,这意味着没有人想出一种方法来生成 SHA-1 冲突。这并不意味着它真的很安全并且不可能产生碰撞 - 也许还有一个尚未发现的漏洞。即使存在漏洞,相同的字符串也极不可能同时形成 MD5 和 SHA-1 冲突。

    【讨论】:

    • 实际上任何 z 都可以完成这项工作。我在这个网站上找到了 a 和 b:mscs.dal.ca/~selinger/md5collision 如果你在这些“字符串”后面加上任何相同的东西,你最终会得到相同的 md5。我的问题与安全无关,我只是好奇。检查这些:hexpaste.com/qzNCBRYb/1hexpaste.com/mSXMl13A/1 Btw:我说的是不同的字符串(a、b 和 c、d)。
    • @Vili:我明白了,我不知道碰撞对 MD5 来说如此糟糕。无论如何,SHA1 被认为是安全的,这意味着碰撞生成非常困难,以至于没有人可以在合理的时间内尝试它。
    【解决方案2】:

    Sha1 不像 md5 那样容易破解,但他们确实在 05 年发现了一些漏洞。

    【讨论】:

    • a paper, written with John Kelsey, that describes an algorithm to find second preimages with SHA-1 ­-- a technique that generalizes to almost all other hash functions -- in 2^106 calculations: much less than the 2^160 calculations for brute force.
    • 我的问题不是关于破解 sha1,而是关于:这些是否相等:sha1(c.z), sha1(d.z) if sha1(c) == sha1(d)?
    【解决方案3】:

    在这种情况下,SHA1 的行为与 MD5 完全相同。

    我找到的仅有的两个参考文献如下 -

    1. http://www.iaik.tugraz.at/content/research/krypto/sha1/MeaningfulCollisions.php
    2. http://www.schneier.com/blog/archives/2005/02/sha1_broken.html#c1654(见 David Schwartz 的评论)

    来自 IAIK 网站 -

    请注意,对于冲突的 SHA-1 消息对(对于遵循类似设计原则的所有其他哈希函数),只要它们相同,始终可以为两条消息附加后缀。

    我认为没有人发现 SHA1 的两个冲突字符串,所以这主要是学术讨论。但据我了解,发现碰撞时,应该可以使用此属性创建其他几个碰撞。

    【讨论】:

      【解决方案4】:

      我认为你的例子是错误的。 让我告诉你为什么:

      md5(a) == md5(b)
      

      当两个哈希值相同时,对应的字符串必须相同(这可能是冲突,但在我的论文中并不重要),所以我们会有:

      a = b
      

      当您现在将两个字符串与字符串 z 连接时,您将拥有 a.z = b.z 并且它们的 md5 哈希值将相同,因为它们具有相同的字符串输入

      md5(a.z) == md5(b.z)
      

      当两个字符串输入相同时,md5-hash 将第三次相等

      md5(z.a) == md5(z.b)
      

      对于 md5 和所有其他散列算法也是如此,但它们必须是确定性且无副作用的。


      因此,只有当 z 是会导致冲突的特殊字符串时,您的示例才有意义。因此 md5 和 sha1 的行为将完全相同: 附加的冲突字符串将导致冲突,但前置将是不同的哈希(但是您找到一个碰撞字符串的可能性非常低事实上) 您只是没有找到具有相同 sha1 的两个不同字符串,因为正如我之前的人所解释的那样,冲突更难找到。

      【讨论】:

      • a!=b,检查问题的编辑部分。 z 可以是任何东西。我认为有一个规则,a mod 128 必须是0
      最近更新 更多