Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 暴力只对某些密码有效,而对其他密码无效,不管有多困难?_Python_Python 3.x_Brute Force - Fatal编程技术网

Python 暴力只对某些密码有效,而对其他密码无效,不管有多困难?

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

所以我有一个程序,我想做,但这里的事情。它试图在字符串中强制输入密码,但问题是它只能得到一些。例如,这一个最多可以处理5个字符。如果我把密码设置为gbdff,它会很容易破解,但是你好,它会停止,为什么?这是代码


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)