用线程暴力破解?

Bruteforce with threads?

所以我决定做一个暴力破解并循环运行。遗憾的是它真的很慢所以这是代码和问题:

import itertools
from time import sleep
import os
import multiprocessing as mp
from threading import Thread
import keyboard

count = CharLength = 1

pw = input("Password: ")

chars = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.")

for CharLength in range(25):
    password = (itertools.product(chars, repeat = CharLength))
    for i in password:
        if keyboard.is_pressed("esc"):
            print("\"esc\" pressed. Program ended.")
            exit()
        count += 1
        i = str(i)
        i = i.replace("'", "")
        i = i.replace(" ", "")
        i = i.replace(",", "")
        i = i.replace("(", "")
        i = i.replace(")", "")
        print(i)
        if i == pw:
            print("\n-=-=-=-=-=-=\n")
            print("Password found: " + i)
            print("\n-=-=-=-=-=-=\n")
            exit()


我想知道我是否可以加快猜测密码的过程,也许可以使用多个线程(也可以没有线程!)?

有什么问题尽管问我!

-荷花

关于Python和多线程优化:

请注意,Python 使用 GIL(全局解释器锁) 换一种说法。 Python 永远不会同时执行多个 Python 字节代码,即使您有多个线程和多个 CPUs。

因此对于纯 Python 代码(没有 C 绑定,释放 GIL)Python 线程永远不会提高 CPU 绑定代码的性能)

如果你想提高性能,我建议你使用多处理模块。

关于潜在的优化:

我试图在我 10 多年前的机器上猜密码 awdf

使用您的代码大约需要 18.5 秒:

1.) 删除 print() 你减少到 11.3 秒

2.)调用函数keyboard.is_pressed()并不便宜,所以每1000次检查一次就可以了 你减少到 1.3 秒

你这样做:

            if count % 1000 == 0:
                if keyboard.is_pressed("esc"):
                    print("\"esc\" pressed. Program ended.")
                    exit()

3.) 将 itertools.product 的结果转换为密码

的更简单方法

而不是

            i = str(i)
            i = i.replace("'", "")
            i = i.replace(" ", "")
            i = i.replace(",", "")
            i = i.replace("(", "")
            i = i.replace(")", "")

随便做

i ="".join(i)

你缩短到 0.2 秒

4.) 而不是将itertools.product(一个元组)的每个结果都转换成一个字符串 我可以将循环外的密码字符串一次转换成元组,所以我比较元组而不转换。

我降到了 0.15s

最快的版本是0.06s以下。

不再计数/不再中断esc(必须通过终止进程来完成)

    chars = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.")

    pw = tuple(pw)

    for CharLength in range(1, 25):
        passwords = (itertools.product(chars, repeat = CharLength))

        first_match = filter(lambda elm: elm == pw, passwords)
        try:
            passwd = next(first_match)
            passwd =  "".join(passwd)
            print("Password found: " + passwd)
        except StopIteration:
            pass

但请注意,在大多数实际情况下,判断密码是否正确不是通过字符串比较来完成的,而是通过计算哈希来完成的。这些操作是故意放慢的,因此它们可能比我在这里的任何优化都重要得多。