【发布时间】:2021-11-25 23:12:14
【问题描述】:
下午好,
我对 python 编码非常陌生,我正在尝试为学校项目编写一个非常基本的 md5 强力密码破解程序。
我应该编写一个脚本来破解一系列 MD5 散列密码。密码必须从名为“hashes.txt”的文本文件中读取,每一行都有一个密码。然后脚本应该开始生成密码,从单个字符开始,然后是两个字符,等等
我对如何制作一个蛮力破解者的思考过程如下:
import hashlib
import itertools
abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@0123456789"
abc_list = list(abc)
def combo():
md5_hash = ""
file_name = open("hashes.txt", "r")
for password in file_name:
password = password.strip()
#print(password)
for r in range(len(abc_list)):
combinations_object = itertools.combinations(abc_list, r)
combinations_list = list(combinations_object)
#print(combinations_list)
for lis in combinations_list:
glue = "".join(lis)
hash_object = hashlib.md5(glue.encode())
md5_hash = hash_object.hexdigest()
print(glue)
#print(md5_hash)
#print(glue + " " + md5_hash)
if md5_hash == password :
print("Your password is: " + "'" + glue +"' "+ md5_hash)
break
我要破解的密码是: Z, 广告, 上帝, 1234, AbCdE, 木马
每次我运行脚本时,它只输出密码:Z,然后在不满足“if”语句的情况下运行其余部分。
我尝试在“if”下使用“break”语句,但结果是一样的。
【问题讨论】:
-
您可以考虑将您的
for r循环放入一个单独的函数中,这样您就可以在成功时使用return。否则,您需要添加一个found变量。将found设置为False,然后当你找到命中集found = True,然后在内部for循环之后执行if found: break。 -
如果您只打算在
for循环中使用组合,则无需将组合转换为列表。一旦获得更长的列表,您当然不想创建列表;列表太大了。 -
@TimRoberts 没有“需要”
found变量,也可以使用 else/continue/break。 -
@KellyBundy 我不同意。你可以从最里面的循环
break,但不知何故你需要一个信号来退出中间循环。这将需要额外的状态。 -
@TimRoberts That
breakis signal enough.
标签: python python-3.x