В каждом из них есть разные списки с разными именами функций, например:
md5 = [gamma, alpha, beta, theta, delta]
sha1 = [alpha, beta, theta, delta]
sha256 = [alpha, beta, theta]
sha384 = [alpha, beta, theta]
sha512 = [alpha, beta, theta]
Это означает, что если функция для должна вызвать список мд5, то будут запущены все функции внутри списка md5.
Один из этих списков будет вызываться в соответствии со словарем списка. Но для того, чтобы определить, какой список функций брать, есть словарь, созданный так:
hashdict = {}
hashdict['md5'] = [ 'md5' , 32 , md5 ]
hashdict['sha1'] = [ 'sha1' , 40 , sha1 ]
hashdict['sha256'] = [ 'sha256' , 64 , sha256 ]
hashdict['sha384'] = [ 'sha384' , 96 , sha384 ]
hashdict['sha512'] = [ 'sha512' , 128 , sha512 ]
Эта функция принимает хэш, отправленный пользователем, проверяет, соответствует ли длина строки длине в любых списках словарей внутри hashdict{}. Если длина соответствует например: 32 символа, то это будет хэш md5.
После того, как скрипт узнает правильный список в словаре, он возьмет функцию (третий элемент списка — второй индекс списка) из конкретного списка в hashdict и передаст ее в вызов функции с именем API.
def crack(hashvalue):
result = False
hashInDict = False
for hashList in list(hashdict.values()):
if len(hashvalue) in hashList:
hashInDict = True
if not file:
print(f'{info} Hash Function : {hashList[0].upper()}')
for api in hashList[2]:
r = api(hashvalue, hashList[0])
if r:
return r
else:
if hashInDict == False:
if not file:
print(f'{bad} This hash type is not supported.')
quit()
else:
return False
Это работает, только если хэш md5, а любой другой переданный хэш приводит к сообщению «Этот тип хэша не поддерживается». Как-то. если я удалю словарь и вместо этого использую if-else для сравнения длины хеш-строки, все работает нормально. Но использование списков словарей привело к тому, что все остальные хэши были проигнорированы, и работал только первый список словарей.
Если я заменю первый список словарей, например, на sha1, то будут обнаружены только хэши sha1, а все остальные приведут к тому, что хэш не поддерживается.
Я понятия не имею, почему он игнорирует что-либо после первого элемента списка словарей.
Пожалуйста, добавьте ввод и желаемый вывод. Намного проще помочь.
@Jab >> Спасибо за ответ. Я отредактировал весь вопрос с соответствующим кодом. Основная идея заключается в том, что пользователь вводит хэш, затем скрипт определяет тип хеша по длине строки и соответственно запускает разный список функций для взлома каждого типа хеша.
@Error-SyntacticalRemorse >> Спасибо за ответ, я отредактировал весь вопрос с соответствующим кодом.
Кажется, вы действительно слишком усложняете это, все, что вы, кажется, делаете, это если длина ввода соответствует заранее определенному числу, затем вызываете api
, передавая введенную строку и список функций, а затем возвращаете ее значение, в противном случае возвращает False.
Просто сделайте диктовку, которая выглядит так:
hash_dict = {
32: [gamma, alpha, beta, theta, delta],
40: [alpha, beta, theta, delta],
64: [alpha, beta, theta],
96: [alpha, beta, theta],
128: [alpha, beta, theta]
}
Затем в функции crack
просто вызовите .get
с помощью len(hash_value)
, и в dict он возвращает значение, в противном случае возвращает None или указанное значение по умолчанию.
def crack(hash_value):
hash_list = hash_dict.get(len(hash_value))
if hash_list:
return api(hash_value, hash_list)
return False
Здесь я делаю предположение относительно того, что делает api
, но если это просто передача данных через каждую функцию в списке, то это легко сделать в crack
. Вместо return api(hash_value, hash_list)
используйте:
for func in hash_list:
hash_value = func(hash_value)
return hash_value
Или, что еще лучше, просто поместите фактические методы в dict следующим образом (здесь я использую лямбда-выражения для экономии места, хотя я бы предложил фактические функции для удобства чтения):
hashdict = {
32: lambda x: gamma(alpha(beta(theta(delta(x)))))
40: lambda x: alpha(beta(theta, delta(x))),
64: lambda x: alpha(beta(theta(x))),
96: lambda x: alpha(beta(theta(x))),
128: lambda x: alpha(beta(theta(x)))
}
Затем просто сделайте что-то вроде этого:
def crack(hash_value):
def _default(_): False
hash_func = hash_dict.get(len(hash_value), _default)
return hash_func(hash_value)
что такое
hashdict
? Пожалуйста, предоставьте весь соответствующий код, кажется, здесь недостаточно, чтобы сделать логическое предположение о том, что происходит и каким должен быть ожидаемый результат. Кроме того, вы не можете "call
" список... Что вы имеете в виду под этим?