我正在创建一个彩虹表,其中的字符串和哈希表之间用空格隔开。 彩虹表如下所示:
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行中的匹配项,我不需要其他所有行
理想情况下,我仅需要哈希作为输出。
答案 0 :(得分:0)
您希望“查找”而不是“搜索”,因为只有完全匹配才重要。 对于此应用程序,熊猫可能会显得过大。 一对字典就足够了:
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十六进制数的两倍。