如果有任何提供线索的网站链接将非常有帮助。我已经有一个暴力攻击算法,它只是递增整数,并查看它是否与其他哈希匹配。
这完全取决于您所说的“消息”的含义。如果您可以向其中一条消息附加四个无关上下文的字节(即没有任何含义的四个字节),那么它在最原始的意义上变得微不足道。
从位的角度考虑CRC32状态机。
CRC32基于一个伽罗瓦反馈移位寄存器,其状态中的每个位将被来自有效负载数据的32位归纳替换。在每个位的归纳中,由多项式指示的位置将与从移位寄存器末尾观察到的序列进行异或。该序列在填充移位寄存器之前不受输入数据的影响。
例如,假设我们有一个以初始状态10101110、多项式10000011填充未知位X的移位寄存器。
Polynomial * ** |feedback (End of SR.)
State 10101110 0
State X1010111 1
State XX101000 0
State XXX10100 0
State XXXX1010 0
State XXXXX101 1
State XXXXXX01 1
State XXXXXXX1 1
State XXXXXXXX 0
在SR填充之前,反馈不以X为单位提供!因此,为了生成具有预定校验和的消息,您需要获取新消息并生成其CRC,然后计算其下一个32位的反馈。您可以在32步CRC函数中完成此操作。然后,您需要计算此反馈对移位寄存器内容的影响。假如我的计算没有错误,以下表格近似反映了在N次尝试后未找到一次冲突的概率:
N 概率 ------- ----------- 50,000 74.7% 77,000 50.1% 78,000 49.2% 102,000 29.8% 110,000 24.5% 128,000 14.8% 150,000 7.3% 200,000 0.95%
换句话说,必须计算超过200,000个CRC32值才能找到一个重复项的概率小于1%,或者,在尝试102,000次之前找到一个重复项的概率为70.2%。
顺便说一句,这很remarkable,因为例如在第200,000次尝试中找到一个碰撞的概率仍然是1/1000分之1左右((4M - 200,0000) / 4M),但在第200,000次尝试之前已经找到一个碰撞的概率几乎是确定的(无论如何也高于99%)。 这说明了保持迄今为止计算的CRC数据库的兴趣所在。
我们当然可以花时间研究CRC32算法及其基础数学,以寻找更可能产生CRC32碰撞的消息,但是所需的真正随机尝试次数相对较小(几乎可以肯定地找到至少一次碰撞),这种密码分析方法几乎不值得花费努力。例如,假设我们能够发现一种选择更容易相互冲突的消息的方法,我们仍然需要尝试约63,000次才能达到99%的可能性至少有一次碰撞(比200,000好,但仍需要大致相同类型的应用)。
在这个领域,我们唯一需要考虑的是避免长度小于4个字节的消息(我在某处读到CRC32在该消息空间中是双射的),以及避免过于相似的消息(即仅相差一两个字符),因为CRC32的原始目的是检测(并可能自动纠正)这些消息中的小差异。暴力破解需要大约sqrt(6N)个随机长度的消息来获得大小为N的哈希碰撞的95%概率。例如,CRC32,N = 2 ^ 32,您需要大约160,000条消息。
我会假设你的意思是“消息”而不是“密钥”。
如果你可以选择两个“密钥”,那么由于生日悖论,暴力破解将非常快。随机选择消息,计算它们的CRC,记住所有的消息和相关的CRC,每一个新的消息都有越来越多的机会与现有的消息发生碰撞,因为它们积累起来。坦率地说,我预计这种方法在现代计算机上比查找已知的使CRC32发生碰撞的方法更快。
我相信CRC是线性的,所以如果您修改文件中的两个不同部分(原地修改,而不改变长度),CRC中的差异应该被异或在一起。
-- 更正:似乎并不是那么简单。然而,这仍然是我尝试构造碰撞的方法之一--您需要比我今晚倾向于做的更详细地跟踪数学...