首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在每次满足条件时中断一个内部for循环?

如何在每次满足条件时中断一个内部for循环?
EN

Stack Overflow用户
提问于 2021-11-25 23:12:15
回答 2查看 119关注 0票数 0

下午好,

我是python编程的新手,我正在尝试为一个学校项目编写一个非常基本的md5暴力破解密码程序。

我应该写一个脚本,它将破解一系列MD5散列密码。密码必须从名为“hashes.txt”的文本文件中读入,每行一个密码。然后,脚本应该开始生成密码,从单个字符开始,然后是两个字符,依此类推

我对如何制作暴力破解器的思考过程是这样的:

代码语言:javascript
复制
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,AD,上帝,1234,AbCdE,特洛伊木马

每次我运行脚本时,它只输出密码:z,然后运行其余部分,而不执行'if‘语句。

我试过在'if‘下面使用'break’语句,但结果是一样的。

EN

回答 2

Stack Overflow用户

发布于 2021-11-25 23:33:09

创建并存储一次组合列表(或者更确切地说,是生成器)可能会使您受益。

https://stackoverflow.com/a/31474532/11170573

代码语言:javascript
复制
import itertools

def all_combinations(any_list):
    return itertools.chain.from_iterable(
        itertools.combinations(any_list, i + 1)
        for i in range(len(any_list)))

您可以按如下方式更改代码:

代码语言:javascript
复制
import hashlib
import itertools
abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@0123456789"
abc_list = list(abc)

combinations_object = all_combinations(abc_list)

def combo():
    file_name = open("hashes.txt", "r")
    for password in file_name:
        password = password.strip()
        for comb in combinations_object:
            glue = "".join(comb)
            hash_object = hashlib.md5(glue.encode())
            md5_hash = hash_object.hexdigest()
            if md5_hash == password :
                    print("Your password is: " + "'" + glue +"' "+ md5_hash)
                    break
票数 1
EN

Stack Overflow用户

发布于 2021-11-25 23:23:16

当你使用break的时候,你所说的就是打破循环,我现在在中。

请注意,您的条件由三个for循环包装,因此它只会break内部循环,并继续执行其余循环。

你能做的就是Jason Baker在https://stackoverflow.com/a/438869/16627440中的建议。

将该break更改为return md5_hash,并在打印中调用该函数。

代码语言:javascript
复制
if md5_hash == password :
    return md5_hash
代码语言:javascript
复制
# Outside your function
print("Your password is: " + "'" + glue +"' "+ combo())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70118146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档