0

我正在创建一个彩虹表,其中字符串和散列由表中的空格分隔。彩虹表如下所示:

j)O 3be44b195706cdd25e29d2b01a0e88d4
j)P a83079350701398672677a9ffe07108c
j)Q 2952c4654c127f2bb1086b75d8f1f986
j)R 6621ec6e1ba3c3669259894db8cde339
j)S 0442a2ee045e1913cd2eb094e8945399

我想知道如何制作一个 python 程序来搜索字符串并找到哈希,反之亦然。

我已经让它搜索整个文档,但我希望它只搜索特定的列。

我使用了熊猫,现在可以在特定列中进行搜索,但我希望它只找到完全匹配的内容:

working_table = pd.read_csv('rainbow_table_md5.txt', sep = ' ', names=["string", "hash"])
print(working_table['hash'].where(working_table['string'] == input(colored("String: ", 'cyan'))))

现在的代码输出如下:

String: a
0           0cc175b9c0f1b6a831c399e269772661
1                                        NaN
2                                        NaN

                          ...               
14094701                                 NaN
14094702                                 NaN

Name: hash, Length: 14094731, dtype: object

除了第 0 行中的匹配项之外,我不需要所有其他行

理想情况下,我只需要哈希作为输出。

4

1 回答 1

0

您需要“查找”而不是“搜索”,因为只有完全匹配很重要。对于这个应用程序来说,Pandas 可能是矫枉过正。一对字典就足够了:

class Rainbow:

    def __init__(self, infile, k=20):
        self.s_to_hash = {s: hash
                          for s, hash in self._read_tuples(infile)}
        self.hash_to_s = {hash[:k]: s
                          for s, hash in self.s_to_hash.items()}
        self.k = k

    @staticmethod
    def _read_tuples(infile):
        with open(infile) as fin:
            for line in fin:
                s, hash = line.strip().split()
                yield s, hash

选择k < 32是为了节省一些内存,但会冒着(小)散列基于它们的公共前缀发生冲突的风险。根据您的记忆力、桌子大小和对碰撞风险的偏好,将其调高或调低以适应口味。考虑编写一个 getter 函数,然后将其设为hash_to_s私有。

与存储 ascii hex nybbles 相比,存储字节的内存效率将是两倍。

于 2019-03-27T01:29:14.960 回答