Улучшение крекера Python MD5

#python #python-3.x #md5

#python #python-3.x #мд5

Вопрос:

Я просто писал очень простой MD5-взломщик на python. Что он делает, так это загружает 2 списка слов. 1 список слов из pass.txt открытого текста и другой список из hash.txt со всеми хэшами MD5. Он принимает пароли с открытым текстом и генерирует хэш MD5 построчно и сравнивает со всеми MD5 hash.txt . Взломщик работает нормально, пока он работает так, как задумано, но мой вопрос в том, можно ли его улучшить. Допустим, это может быть быстрее, или если я загружу в него огромный список с миллионами паролей, может ли это быть проблемой с ресурсами? И т.д. Или даже механика сравнения строк.

Код:

 def clear_pass():
with open("pass.txt", "r", encoding="latin-1") as file:
    for x in file:
        x = x.strip()
        #print(x)
        str2hash = (x)
        result = hashlib.md5(str2hash.encode())
        final_result = (result.hexdigest())
        #print(final_result)
        with open("hash.txt", "r") as hash_file:
            for z in hash_file:
                z = z.strip()
                if z == final_result:
                    print("[ ] "   final_result  " :", x)
clear_pass()
 

введите описание изображения здесь

Комментарии:

1. На данный момент ваша программа взламывает только один из ваших паролей за раз, используя одно ядро процессора. Вы можете попробовать использовать многопроцессорную обработку (используя несколько ядер одновременно), чтобы таким образом ускорить процесс. Хорошим началом может быть использование concurrent.futures с ProcessPoolExecutor .

2. Кроме того, вы выполняете линейный поиск по всем хэшам в hash.txt для каждого поиска пароля. Это занимает O (n) времени. Было бы быстрее сначала загрузить все хэши в dict — это сэкономит вам накладные расходы на чтение файла и будет занимать постоянное время поиска O (1). Если у вас слишком много хэшей для загрузки в память, вместо этого вы можете использовать базу данных; индексация вашей базы данных даст вам O (log n) времени.

3. спасибо, я тоже рассмотрю это, это выглядит интересно

Ответ №1:

Ваша программа представляет собой дважды вложенный цикл for . Это довольно ужасно. Для каждого слова, для которого вы вычисляете это хэш-значение, вы затем считываете весь файл целиком hash.txt . Вы читаете этот файл снова и снова.

Вместо этого вы должны сделать что-то вроде:

 hash_to_string = {}
with open("pass.txt", "r", encoding="latin-1") as file:
    for x in file:
        ... strip it.  Generate md5.  Call results hash...
        hash_to_string[hash] = x
with open("hash.txt") as hash_file:
    for x in file:
        if x.strip() is a key in the hash_to_string table, you've got the plain text
        otherwise, you're done.
 

Теперь ваш код является линейным, а не O (n ^ 2).

Комментарии:

1. Спасибо за ответ! Я последовал за ответом и почти закончил его. По какой-то причине на последнем шаге я ничего не получаю: with open("hash.txt") as hash_file: for z in hash_file: if z.strip() in hash_to_string: может быть, это потому, что dict не конвертируется?

2. Кстати, мое «в противном случае все готово» должно было означать «посмотрите на следующее значение хэша», а не «return None». Вы пробовали вводить хэш-значение того, что, как вы знаете , находится в pass.txt в hash.txt ? Это позволит вам узнать, работает ли ваш код правильно или нет.

3. Я могу распечатать все значения из словаря в первой части кода, но что бы я ни делал во второй части, ничего не происходит, даже сообщения об ошибке. Я ввел в оба списка допустимые значения, чтобы я знал, что этот хэш — это этот проход

4. Ключ в словаре каким-то образом слегка отличался от ключа, который вы читали из файла? (Дополнительный перевод строки? Прописные или строчные буквы?). Просто любопытно.

5. Нет, они были точно такими же. Я также конвертирую хэши в . lower() на всякий случай. Но похоже, что по какой-то причине он не может читать из словаря, это все равно занимает много времени с большим dict. Не могли бы вы опубликовать код, как он должен выглядеть? Спасибо