用线程暴力破解?
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
但请注意,在大多数实际情况下,判断密码是否正确不是通过字符串比较来完成的,而是通过计算哈希来完成的。这些操作是故意放慢的,因此它们可能比我在这里的任何优化都重要得多。
所以我决定做一个暴力破解并循环运行。遗憾的是它真的很慢所以这是代码和问题:
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
但请注意,在大多数实际情况下,判断密码是否正确不是通过字符串比较来完成的,而是通过计算哈希来完成的。这些操作是故意放慢的,因此它们可能比我在这里的任何优化都重要得多。