【问题标题】:Python MD5 cracker improvementPython MD5 破解器改进
【发布时间】:2020-12-06 09:57:43
【问题描述】:

我只是在 python 中编写了一个非常简单的 MD5 破解程序。它的作用是加载 2 个单词表。 1 个来自pass.txt 的明文单词列表和来自hash.txt 的其他列表,包含所有 MD5 哈希值。它采用明文密码并逐行生成 MD5 哈希值,并与 hash.txt 中的所有 MD5 进行比较。饼干工作正常,到目前为止它按预期工作,但我的问题是它是否可以改进。假设它可以更快,或者如果我在其中加载一个包含数百万个密码的巨大列表,这会是资源问题吗?等等。甚至是比较字符串的机制。

代码:

def clear_pass():
with open("pass.txt", "r", encoding="latin-1") as file:
    for x in file:
        x = x.strip()
        #print(x)
        str2hash = (x)
        result = hashlib.md5(str2hash.encode())
        final_result = (result.hexdigest())
        #print(final_result)
        with open("hash.txt", "r") as hash_file:
            for z in hash_file:
                z = z.strip()
                if z == final_result:
                    print("[+] " + final_result+ " :", x)
clear_pass()

【问题讨论】:

  • 目前您的程序一次只能破解一个密码,使用一个 CPU 内核。您可以尝试使用多处理(同时使用多个内核)来加快速度。将 concurrent.futures 与 ProcessPoolExecutor 一起使用可能是一个不错的起点。
  • 此外,您正在对 hash.txt 中的所有散列进行线性搜索,以查找每个密码。这需要 O(n) 时间。首先将所有哈希加载到字典中会更快 - 这将节省您读取文件的开销,并且将是一个常数时间 O(1) 查找。如果你有太多的哈希值要加载到内存中,那么你可以使用数据库来代替;索引您的数据库将为您提供 O(log n) 时间。
  • 谢谢,我也会研究一下,这看起来很有趣

标签: python python-3.x md5


【解决方案1】:

您的程序是一个双重嵌套的 for 循环。这太可怕了。对于您计算其哈希值的每个单词,您将读取整个文件 hash.txt。你一遍又一遍地阅读那个文件。

您应该改为:

hash_to_string = {}
with open("pass.txt", "r", encoding="latin-1") as file:
    for x in file:
        ... strip it.  Generate md5.  Call results hash...
        hash_to_string[hash] = x
with open("hash.txt") as hash_file:
    for x in file:
        if x.strip() is a key in the hash_to_string table, you've got the plain text
        otherwise, you're done.

您的代码现在是线性的,而不是 O(n^2)。

【讨论】:

  • 感谢您的回答!我按照答案几乎完成了它。由于某些原因,在最后一步中,我没有得到任何东西:with open("hash.txt") as hash_file: for z in hash_file: if z.strip() in hash_to_string: 可能是因为 dict 没有转换?
  • 顺便说一句,我的“否则你就完成了”的意思是“查看下一个哈希值”,而不是“返回无”。您是否尝试过将您知道在 pass.txt 中的东西的哈希值放入 hash.txt 中?这会让你知道你的代码是否正常工作。
  • 我可以在代码的第一部分打印字典中的所有值,但是我在第二部分所做的一切都没有发生,甚至没有错误消息。我在两个列表中都输入了有效值,我知道这个哈希就是这个 pass
  • 字典中的键与您从文件中读取的键在某种程度上存在细微差别? (一个额外的换行符?大写与小写?)。只是好奇。
  • 不,它们完全一样。我还将哈希转换为 .lower() 以防万一。但似乎由于某种原因它可能没有从字典中读取,大字典仍然需要很长时间。您介意发布代码的外观吗?谢谢
猜你喜欢
  • 2016-11-06
  • 2016-11-05
  • 2023-03-12
  • 2013-05-21
  • 1970-01-01
  • 2021-03-12
  • 2011-08-11
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多