递归迭代每个字符组合

2024-04-24 08:16:13 发布

您现在位置:Python中文网/ 问答频道 /正文

预期结果:

该程序将哈希密码作为输入;该密码将传递给解密函数。 该函数迭代每个大小写混合的n字母组合,散列每个这样的字符串。 如果找到与输入匹配的内容,它将输出未哈希的密码;否则,它退出。在

实际结果:

函数只对当前迭代中的最后一个字母迭代每个大小写混合的字母。在

问题描述:

我尝试在Python中实现一个简单的bruteforces加密密码破解器。我用很多for循环实现了一个4字符的密码,但是现在我想用递归对它进行一系列的重构。 如何迭代每个字符组合,从1个字符组合到4个字符字符串组合?在

我想用这句话:

            password[i] = string.ascii_letters[j]

但我得到一个错误:

^{pr2}$

代码片段:

def decrypt(encryptedText):
    # reference global variable
    global password
    # check curr password guess length
    pwdlen = len(password)

    if pwdlen >= 4:
        print("Password is longer than 4 characters, exiting...")
        exit(2)

    # debug lines
    print("password is {}".format(password))
    print("length: {}".format(pwdlen))
    time.sleep(2)

    # first two characters is salt
    salt = encryptedText[:2]

    # Check hashes for every combination of strings and compare them
    # starts with last char
    for i in range(pwdlen, 0, -1):
        for j in range(0, len(string.ascii_letters)):
            password = string.ascii_letters[:pwdlen] + string.ascii_letters[j]
            hashed = crypt.crypt(password, salt)

            # debug line
            print(password)

            # if found - print password and exit
            if hashed == encryptedText:
                print(password)
                exit(0)

    # this makes recursion go through +1 char combinations on every iteration
    password = (pwdlen + 1) * 'a'

    return decrypt(encryptedText)

Tags: 函数字符串密码forstringifisascii
1条回答
网友
1楼 · 发布于 2024-04-24 08:16:13

字符串是不可变的。不能为字符串的一部分指定新值。相反,您必须构建一个新值并将其分配给原始变量。例如:

# password[i] = string.ascii_letters[j]
password = password[:i] + string.ascii_letters[j] + password[i+1:]

第二,使用itertools包生成所需的所有排列,可能可以做得更好。例如,根据需要多次生成asci_字母的乘积,并逐步完成这些字母序列的连接。在

相关问题 更多 >