Python 暴力只对某些密码有效,而对其他密码无效,不管有多困难?
所以我有一个程序,我想做,但这里的事情。它试图在字符串中强制输入密码,但问题是它只能得到一些。例如,这一个最多可以处理5个字符。如果我把密码设置为gbdff,它会很容易破解,但是你好,它会停止,为什么?这是代码Python 暴力只对某些密码有效,而对其他密码无效,不管有多困难?,python,python-3.x,brute-force,Python,Python 3.x,Brute Force,所以我有一个程序,我想做,但这里的事情。它试图在字符串中强制输入密码,但问题是它只能得到一些。例如,这一个最多可以处理5个字符。如果我把密码设置为gbdff,它会很容易破解,但是你好,它会停止,为什么?这是代码 index = 'abcdefghijklmnopqrstuvwxyz1234567890' library = [] for i in index: library.append(i) for i in range(len(index)): brute = st
index = 'abcdefghijklmnopqrstuvwxyz1234567890'
library = []
for i in index:
library.append(i)
for i in range(len(index)):
brute = str(library[i])
if brute == password:
print('Password is', brute)
for w in range(0,i):
brute = str(library[i] + library[w])
if brute == password:
print('Password is', brute)
for x in range(0,i):
brute = str(library[i] + library[w] + library[x])
if brute == password:
print('Password is', brute)
for y in range(0,i):
brute = str(library[i] + library[w] + library[x] + library[y])
if brute == password:
print('Password is', brute)
for z in range(0,i):
brute = str(library[i] + library[w] + library[x] + library[y] + library[z])
if brute == password:
print('Password is', brute)```
您可以使用来生成输入的所有可能组合,而不是使用所有嵌套for循环
itertools.product(index, repeat=len(password))
这将返回一个生成器,生成与密码长度相同的元组,以便我们可以使用它将它们转换为字符串
map(''.join, itertools.product(index, repeat=len(password)))
然后你可以在这个生成器上循环找到结果
for brute in map(''.join, itertools.product(index, repeat=len(password))):
if brute == password:
print('Password is', brute)
break
编辑:
如果您不能导入任何内容,itertools.product的文档给出了一个等效方法的示例。你必须根据自己的需要来调整
此函数大致相当于以下代码,但实际实现不会在内存中建立中间结果:
如果我理解正确,你想尝试所有字母组合,长度不超过5。我不使用循环嵌套,而是使用如下递归: 索引=列表'ABCDEFGHIJKLMNOPQRSTUVXYZ1234567890' def递归最大深度,dep=1,cur=: 如果cur==hel:win条件 打印密码:+cur 返回True; 对于索引中的c:对于该层上的每个字符 如果深度<最大深度:不要超过最大深度 如果递归最大深度、深度+1、电流+c: 返回递归堆栈的真正中断 递归5
我的问题的简单答案是解决这个问题。 替换范围0中的w,i:为范围0中的w,lenlibrary:
这将使它按顺序上升 您只检查索引小于第一个字母的字母。您将只匹配所有字符都在第一个字母“之前”的输入,那么我如何修复它?你能给我看一些代码吗?不是你的问题,只是一个一般的想法:这个脚本可能会从使用递归中受益。另外,在index:library.appendi中不需要使用for i。您可以简单地执行library=listindex。有没有一种方法可以不使用importsing递归(唯一的way@TechySavage文档中有一个等效函数的示例。粘贴到答案中
def product(*args, **kwds):
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)