我正在执行一项任务,其中给了我 1000 个 SHA1 摘要及其相应的密码(每个 24 位或 6 个十六进制数字长)。我必须在磁盘上和 Java 中构建一个 <2MB 的彩虹表,我发现链长度 > 192 会使搜索过程太慢。
要求是这个彩虹表应该解决至少 45%(或 450)个哈希并返回密码。归约函数很简单 - 从哈希中获取最高有效的 32 位(比如说 d0、d1、d2),将链的当前长度(i 从 0 到 191)仅添加到 d0(如下所示),然后:
d0 = (d0+i)%256 //8bits
d1 = d1%256 //8bits
d2 = d2%256 //8bits
我确信代码(散列和归约)函数是正确的。但是我只能通过这种方式解决大约 250 个哈希(25% 的准确率)到他们相应的密码。
如果我增加链的数量,我会看到相应数量的哈希解决的收益递减。就像如果我将链数加倍,精度不会加倍,但彩虹表的大小已经> 2MB(它像8MB)。
对于起始词 - 我尝试从 0 开始(完整范围为 0 到 2^24)并以 1 递增,或者我什至尝试使其在此范围之间随机化。彩虹表没有循环,即使在归约函数中发生了一些冲突(与归约函数的深度相同,如上所述不同),我不接受端点已经在表中的链。
如果我能将准确率提高到 45%,我将不胜感激。