python - 如何对暴力进行密码的所有排列?

标签 python python-3.x permutation brute-force

所以我试图制作一个暴力破解密码的程序。

首先,我编写了一个密码长度为1的程序:

password = input('What is your password?\n')
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

def brute_force():
    for char in chars:
        if char == password:
            return char

print(brute_force())

然后,我将其编辑为长度为2的密码:
def brute_force():
    guess = [None, None]
    for char in chars:
        guess[0] = char
        for char2 in chars:
            guess[1] = char2
            if ''.join(guess) == password:
                return ''.join(guess)

最后,我对长度为3的密码进行了相同的操作:
def brute_force():
    guess = [None, None, None]
    for char in chars:
        guess[0] = char
        for char2 in chars:
            guess[1] = char2
            for char3 in chars:
                guess[2] = char3
                if ''.join(guess) == password:
                    return ''.join(guess)

我如何才能将其概括为一个名为length的变量,其中包含密码长度的整数值?

最佳答案

您可以使用以下递归函数:

def brute_force(string, length, goal):
    if not length:
        if string == goal:
            return string
        return False
    for c in chars:
         s = brute_force(string + c, length - 1, goal)
         if s:
             return s
    return False

您可以使用以下语法来调用该语法:
>>> brute_force('', 3, 'bob')
'bob'
>>> brute_force('', 2, 'yo')
'yo'

为什么会起作用?

我们总是使用三个变量来调用每个函数:stringlengthgoal。变量string会保留当前的猜测,因此在第一个示例中,string将是bob之前的所有内容,例如abbo等。

下一个变量length保留多少个字符,直到string的长度正确为止。

下一个变量goal是我们刚刚通过并与之进行比较的正确密码。

在该函数的主体中,我们需要首先检查length0的情况(通过检查not length完成,因为0评估为False)。当我们已经有一个目标长度的字符串,而我们只是想检查它是否正确时,就是这种情况。

如果匹配,则返回字符串,否则返回False。我们返回解决方案或False来向调用我们的函数(堆栈中的上面的调用)表明我们找到了(或没有)正确的密码。

现在,我们已经完成了length = 0的情况,现在需要处理其他情况。

在这些情况下,目标是获取被我们调用的字符串,并遍历chars中的所有字符,每次调用brute_force函数(递归)时,将我们被调用的字符串串联在一起的结果是该字符(c)。

这将创建一个像effect这样的树,其中检查每个字符串(直到原始length)的

当调用下一个函数时,我们还需要知道如何处理lengthgoal变量。

好了,要处理这些问题,我们只需要考虑下一个功能需要知道什么。它已经有了string(因为这是在chars字符串中连接下一个字符的结果),而length会少一些,因为我们只是通过串联将一个字符添加到string中,而goal显然将是相同-我们仍在搜索相同的密码。

既然我们已经调用了此函数,它将在每次后续调用的长度中减去一个,直到最终达到length == 0的情况。而且我们再次处于简单的情况下,已经知道该怎么做!

因此,在调用它之后,该函数将返回以下两项之一:要么False指示最后一个节点未找到密码(所以这种情况将在类似ab的内容到达我们搜索bob的末尾的情况下发生,因此返回了False (未找到解决方案后),或者该调用可以返回实际的解决方案。

处理这些情况很简单,如果我们得到了实际的解决方案,我们只想将它返回到链上,如果我们失败了(False),我们只想返回False,这将向我们上方的节点表明我们已经完成了不成功,并告诉它继续搜索。

所以现在,我们只需要知道如何调用该函数。我们只需要发送一个空的string和一个目标lengthgoal值,然后进行递归即可。

注意最后一件事是,如果您希望此方法更加整洁,则可以将函数定义修改为:
def brute_force(length, goal, string=''):
    ...

并更改其中的递归调用。这样,您可以使用类似于brute_force(3, 'bob')的函数来调用该函数,而无需指定string应该以什么开头。这只是您可以随意添加的内容,但对于该功能起作用不是必需的。

关于python - 如何对暴力进行密码的所有排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47952987/

相关文章:

c - 按字母顺序排列

c - C 中打印所有 32 位数字序列的函数

python - zsh:/usr/local/bin/pipenv:错误的解释器:/usr/local/opt/python/bin/python3.7:没有这样的文件或目录

python - 让角色在按住按键的同时继续移动

Python Timenow 没有毫秒?

python - 在我得到特定范围内的整数之前,如何继续要求用户输入?

python - 如何在 1 行中分配具有相同参数的 2 个变量

algorithm - Prolog排列

python - 如何在 python 中定义一个识别我的日期格式的函数

Python3,beautifulsoup,在特定页面不返回任何内容