【问题标题】:How do I break an inner for loop every time a condition is satisfied?每次满足条件时如何打破内部 for 循环?
【发布时间】: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,但不知何故你需要一个信号来退出中间循环。这将需要额外的状态。

标签: python python-3.x


【解决方案1】:

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

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

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)))

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

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

【讨论】:

  • 那会在哪里?
  • 你是说glue = "".join(comb)
  • @KellyBundy 这不是 python2
  • 啊没看到那个;)
  • 抱歉已修复。 (我刚刚从原始堆栈中复制了代码,没有看到 python 版本)。还固定了胶水。
【解决方案2】:

当您使用break 时,您的意思是打破我目前所处的循环

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

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

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

if md5_hash == password :
    return md5_hash
# Outside your function
print("Your password is: " + "'" + glue +"' "+ combo())

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2020-04-21
    • 2021-09-21
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多