所以我试图制作一个暴力破解密码的程序。
首先,我编写了一个密码长度为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'
为什么会起作用?
我们总是使用三个变量来调用每个函数:
string
,length
和goal
。变量string
会保留当前的猜测,因此在第一个示例中,string
将是bob
之前的所有内容,例如ab
,bo
等。下一个变量
length
保留多少个字符,直到string
的长度正确为止。下一个变量
goal
是我们刚刚通过并与之进行比较的正确密码。在该函数的主体中,我们需要首先检查
length
是0
的情况(通过检查not length
完成,因为0
评估为False
)。当我们已经有一个目标长度的字符串,而我们只是想检查它是否正确时,就是这种情况。如果匹配,则返回字符串,否则返回
False
。我们返回解决方案或False
来向调用我们的函数(堆栈中的上面的调用)表明我们找到了(或没有)正确的密码。现在,我们已经完成了
length = 0
的情况,现在需要处理其他情况。在这些情况下,目标是获取被我们调用的字符串,并遍历
chars
中的所有字符,每次调用brute_force
函数(递归)时,将我们被调用的字符串串联在一起的结果是该字符(c
)。这将创建一个像effect这样的树,其中检查每个字符串(直到原始
length
)的。当调用下一个函数时,我们还需要知道如何处理
length
和goal
变量。好了,要处理这些问题,我们只需要考虑下一个功能需要知道什么。它已经有了
string
(因为这是在chars
字符串中连接下一个字符的结果),而length
会少一些,因为我们只是通过串联将一个字符添加到string
中,而goal
显然将是相同-我们仍在搜索相同的密码。既然我们已经调用了此函数,它将在每次后续调用的长度中减去一个,直到最终达到
length == 0
的情况。而且我们再次处于简单的情况下,已经知道该怎么做!因此,在调用它之后,该函数将返回以下两项之一:要么
False
指示最后一个节点未找到密码(所以这种情况将在类似ab
的内容到达我们搜索bob
的末尾的情况下发生,因此返回了False
(未找到解决方案后),或者该调用可以返回实际的解决方案。处理这些情况很简单,如果我们得到了实际的解决方案,我们只想将它返回到链上,如果我们失败了(
False
),我们只想返回False
,这将向我们上方的节点表明我们已经完成了不成功,并告诉它继续搜索。所以现在,我们只需要知道如何调用该函数。我们只需要发送一个空的
string
和一个目标length
和goal
值,然后进行递归即可。注意最后一件事是,如果您希望此方法更加整洁,则可以将函数定义修改为:
def brute_force(length, goal, string=''):
...
并更改其中的递归调用。这样,您可以使用类似于
brute_force(3, 'bob')
的函数来调用该函数,而无需指定string
应该以什么开头。这只是您可以随意添加的内容,但对于该功能起作用不是必需的。
关于python - 如何对暴力进行密码的所有排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47952987/