递归遍历每个字符组合
Recursively iterating over every character combination
预期结果:
该程序将散列密码作为输入;这被传递给解密函数。
该函数遍历每个混合大小写的 n 字母组合,散列每个这样的字符串。
如果它找到与输入匹配的内容,它会打印出未散列的密码;否则,它退出。
实际结果:
函数仅对当前迭代中最后一个字母的每个混合大小写字母进行迭代。
问题描述:
我正在尝试在 Python 中实现一个简单的 DES 加密密码破解器。我使用大量 for 循环实现了 4 个字符的密码,但现在我想使用递归将其重构为一定长度范围。
如何遍历每个字符组合,从 1 个字符组合到 4 个字符的字符串组合?
我想用这条线:
password[i] = string.ascii_letters[j]
但是我得到这个错误:
TypeError: 'str' object does not support item assignment
代码片段:
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)
字符串是不可变的。您不能为字符串的一部分分配新值。相反,您必须构建一个新值并将其分配给原始变量。例如:
# password[i] = string.ascii_letters[j]
password = password[:i] + string.ascii_letters[j] + password[i+1:]
其次,您可以使用 itertools 程序包生成您想要的所有排列,从而做得更好。例如,根据需要多次生成 asci_letters 的乘积,然后逐步执行这些字母序列的 join。
预期结果:
该程序将散列密码作为输入;这被传递给解密函数。 该函数遍历每个混合大小写的 n 字母组合,散列每个这样的字符串。 如果它找到与输入匹配的内容,它会打印出未散列的密码;否则,它退出。
实际结果:
函数仅对当前迭代中最后一个字母的每个混合大小写字母进行迭代。
问题描述:
我正在尝试在 Python 中实现一个简单的 DES 加密密码破解器。我使用大量 for 循环实现了 4 个字符的密码,但现在我想使用递归将其重构为一定长度范围。 如何遍历每个字符组合,从 1 个字符组合到 4 个字符的字符串组合?
我想用这条线:
password[i] = string.ascii_letters[j]
但是我得到这个错误:
TypeError: 'str' object does not support item assignment
代码片段:
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)
字符串是不可变的。您不能为字符串的一部分分配新值。相反,您必须构建一个新值并将其分配给原始变量。例如:
# password[i] = string.ascii_letters[j]
password = password[:i] + string.ascii_letters[j] + password[i+1:]
其次,您可以使用 itertools 程序包生成您想要的所有排列,从而做得更好。例如,根据需要多次生成 asci_letters 的乘积,然后逐步执行这些字母序列的 join。