精神疲惫。
仅针对上下文的解释,实际上不需要哈希帮助:
我正在尝试制作一个python脚本,它可以伪造哈希字符串或密码(仅供学习,我相信这里和那里都有tenter代码(。目标是制作一个函数,可以尝试不同字母的所有可能组合,从一个字符(a,b…y,z(开始,然后开始尝试另一个字符,直到找到匹配。
首先,它要求你输入一个字符串(例如aaaa(,然后对字符串进行散列,然后尝试用函数对该散列进行粗化,最后函数在找到匹配项时再次返回字符串。
PASSWORD_INPUT = input("Password string input: ")
PASSWORD_HASH = encrypt_password(PASSWORD_INPUT) # This returns the clean hash
found_password = old_decrypt() # This is the function below
print(found_password)
我成功地完成了这段丑陋的代码:
built_password = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
def old_decrypt():
global built_password
# First letter
for a in range(len(characters)): # Characters is a list with the abecedary
built_password[0] = characters[a]
if test_password(pretty(built_password)): # This returns True if it matches
return pretty(built_password)
# Second letter
for b in range(len(characters)):
built_password[1] = characters[b]
if test_password(pretty(built_password)):
return pretty(built_password)
# Third letter
for c in range(len(characters)):
built_password[2] = characters[c]
if test_password(pretty(built_password)):
return pretty(built_password)
# Fourth letter
for d in range(len(characters)):
built_password[3] = characters[d]
if test_password(pretty(built_password)):
return pretty(built_password)
问题是它只适用于4个字母的字符串。
正如你所看到的,每个字母的循环几乎完全相同,所以我想"嘿,我可以把它变成一个单一的函数;。。。在痴迷地尝试了我脑海中的所有东西整整3天后,我得到了这个:
# THIS WORKS
def decrypt(letters_amount_int):
global built_password
for function_num in range(letters_amount_int):
for letter in range(len(characters)):
built_password[function_num] = characters[letter]
if letters_amount_int >= 1:
decrypt(letters_amount_int - 1)
if test_password(pretty(built_password)):
return pretty(built_password)
# START
n = 1
while True:
returned = decrypt(n)
# If it returns a string it gets printed, else trying to print None raises TypeError
try:
print("Found hash for: " + returned)
break
except TypeError:
n += 1
函数得到一个";1〃;,尝试使用1个字母,如果它没有返回任何内容,则得到一个";2〃;然后尝试使用2。它是有效的,但由于某种原因,它产生了大量不必要的循环,花费了越来越多的时间。我一直在思考,得出的结论是,我对python的内部功能一无所知。
有人能帮我照一下吗?感谢
在需要的情况下,这些是其他功能:
def encrypt_password(password_str):
return hashlib.sha256(password_str.encode()).hexdigest()
def test_password(password_to_test_str):
global PASSWORD_HASH
if PASSWORD_HASH == encrypt_password(password_to_test_str):
return True
characters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z']
在这种情况下递归提供了一个非常优雅的解决方案:
def add_char(s, limit):
if len(s) == limit:
yield s
else:
for c in characters:
yield from add_char(s + c, limit)
def generate_all_passwords_up_to_length(maxlen):
for i in range(1, maxlen + 1):
yield from add_char("", i)
for password in generate_all_passwords_up_to_length(5):
test_password(password)
也许你可以试试这样的方法。灵感来自多种排列,包括重复的
Itertools有一个笛卡尔乘积生成器,它与置换有关。
import itertools
def decrypt(characters, num_chars):
for test_list in itertools.product(characters, repeat=num_chars):
test_str = ''.join(test_list)
if test_password(test_str):
return test_str
return None
for i in range(min_chars, max_chars+1):
result = decrypt(characters, i)
if result:
print(f'Match found: {result}')
如果您使用characters, min_chars, max_chars = (characters, 1, 3)
运行此代码,并在每一步打印test_str
,您将获得:
0
1
2
00
01
02
10
11
12
20
21
22
或者如果找到匹配,将提前停止。若您想了解更多信息,我建议您查找笛卡尔乘积函数的递归纯python实现。然而,我怀疑笛卡尔乘积生成器将比递归解决方案更快。
请注意,itertools.product((是一个生成器,因此它会根据需要生成每个值,并且以这种方式编写它可以让您更快地找到短字符串的匹配项。但这种强力算法所花费的时间确实应该随着真实密码的长度呈指数级增长。
希望这能有所帮助。