众所周知
1. if ( md5(a) == md5(b) )
2. then ( md5(a.z) == md5(b.z) )
3. but ( md5(z.a) != md5(z.b) )
其中点连接字符串。
编辑---
您可以在此处找到a
和b
:
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 还有其他有趣的“规则”吗?
答案 0 :(得分:1)
第一个语句仅适用于针对给定z
和a
专门计算的非常具体的b
。确实,您可以生成MD5冲突,但这并非易事 - 需要一些计算工作,当然您不能指望任何z
都可以。
目前,SHA-1被认为是加密安全的,这意味着没有人想出一种生成SHA-1冲突的方法。这并不意味着它确实是安全的,并且不可能产生冲突 - 也许还有一个尚未发现的漏洞。即使存在漏洞,相同的字符串也不太可能同时形成MD5和SHA-1冲突。
答案 1 :(得分:1)
在这种情况下,SHA1的行为与MD5完全相同。
我找到的唯一两个参考文献如下 -
来自IAIK网站 -
请注意,对于冲突的SHA-1消息对(对于遵循类似设计原则的所有其他散列函数),只要它们相同,就始终可以在两个消息中附加后缀。
我认为没有人为SHA1找到两个碰撞字符串,所以这主要是学术讨论。但据我所知,发现碰撞时,应该可以通过使用此属性创建其他几个碰撞。
答案 2 :(得分:0)
Sha1并不像md5那样容易破解,但他们确实在05年发现了一些漏洞。我相信。
答案 3 :(得分:0)
我认为你的例子是错误的。 让我告诉你原因:
md5(a) == md5(b)
当两个哈希值相同时,相应的字符串必须相同(这可能是碰撞,但在我的论文中并不重要),所以我们将:
a = b
当你现在用字符串z连接两个字符串时,你将拥有 a.z = b.z. 并且它们的md5-hashes将是相同的,因为它们具有相同的字符串输入
md5(a.z) == md5(b.z)
并且md5-hash将第三次等于两个字符串输入相同
md5(z.a) == md5(z.b)
对于md5和其他所有哈希算法都是如此,而它们必须是确定性的并且没有副作用。
所以你的例子只有在z是一个会导致碰撞的特殊字符串时才有意义。因此md5和sha1的行为完全相同: 附加的碰撞字符串将导致碰撞,但前置的将是不同的哈希值(但是你发现碰撞字符串的概率确实非常低,它将被预先依赖并附加导致碰撞,但是还没有找到任何示例事实上) 你只是没有找到两个具有相同sha1的不同字符串,因为碰撞很难找到,正如我之前的人所解释的那样。