我正在做一个项目,找到两个不同的句子,它们基于减少的sha1散列给出部分碰撞。我的程序将生成两个不同的消息。如果两个句子的散列的第一个32位匹配,程序将停止,否则它将重复直到检测到碰撞。
我的程序运行良好,但是搜索结果的时间要慢。我怎样才能加快速度。我读了,发现我可以使用生日悖论,我该如何实现呢?
我做了一些搜索并获得相关答案,但我仍然对生日悖论感到困惑。
Probability of SHA1 collisions
http://www.metzdowd.com/pipermail/cryptography/2004-August/007409.html
http://www.freelists.org/post/hashcash/Hashcash-and-the-cracking-of-SHA1,2
这是我的计划的工作方式:
Generate random number() // let say i generate 100 number
Generate random char1() // we will generate 100 char
Hash() // the first 100 char
Generate random char2() // we will generate another 100 char
Hash2() // this 100 char again
Get the 32 bit of the random char1()
Get the 32 bit of the random char2()
compare the 32 bit for partial collision
If they dont match we will keep on doing until partial collision is found.
答案 0 :(得分:1)
如果您在散列函数中寻找部分冲突,则每次您必须接受极长的运行时间时尝试一对随机输入。对于32位和一个完美的散列函数,它是1 /(2 ^ 32)碰撞的可能性。
要利用生日悖论,您需要存储您生成的哈希值并检查所有哈希值。这是有效的,因为你正在寻找一个碰撞,你并不真正关心最终碰撞的哈希产生了什么。阅读生日悖论如何使用人类和生日,并确保在将其应用于散列之前了解它。 By the math here你只需要~77,000个哈希就有50%的机会在它们之间找到32位的冲突。