Что эффективный путь состоит в том, чтобы записать паролю, взламывающему алгоритм (Python)

Эта проблема могла бы быть относительно простой, но мне дают два текстовых файла. Один текстовый файл содержит все зашифрованные пароли, зашифрованные через crypt.crypt в Python. Другой список содержит по 400k + нормальные слова словаря.

Присвоение - то, что, учитывая 3 различных функции, которые преобразовывают строки от их нормального случая до всех различных перестановок капитализаций, преобразовывает букву к числу (если это выглядит подобным, например, G-> 6, B-> 8), и инвертирует строку. Вещь - это, учитывая эти 10 - 20 зашифрованных паролей в файле паролей, что самый эффективный путь состоит в том, чтобы заставить самое быстрое рабочее решение в Python выполнять те функции на слове словаря в файле слов? Это - учитывая, что все те слова при преобразовании любым способом зашифруют к паролю в файле паролей.

Вот функция, которая проверяет, совпадает ли данная строка при шифровании с зашифрованным паролем, переданным в:

def check_pass(plaintext,encrypted):
 crypted_pass = crypt.crypt(plaintext,encrypted)
 if crypted_pass == encrypted:
  return True
 else:
  return False

Заранее спасибо.

6
задан Luminance 23 May 2010 в 20:49
поделиться

2 ответа

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

Единственный способ ускорить такую ​​атаку методом перебора - получить более мощное оборудование и разделить задачу и запустить взломщик параллельно.

3
ответ дан 17 December 2019 в 04:43
поделиться

На моем медленном ноутбуке crypt.crypt занимает около 20 микросекунд:

$ python -mtimeit -s'import crypt' 'crypt.crypt("foobar", "zappa")'
10000 loops, best of 3: 21.8 usec per loop

так что метод грубой силы (на самом деле единственный разумный) «отчасти» осуществим. Применяя ваши функции преобразования, вы получите (приблизительная оценка) около 100 преобразованных слов на слово в словаре (в основном из-за изменения заглавных букв), то есть около 40 миллионов преобразованных слов из всего вашего словаря. При 20 микросекундах каждая, это займет около 800 секунд, назовем это 15 минутами, для попытки взломать один из паролей, который на самом деле не соответствует ни одному из вариантов; ожидаемое время примерно вдвое меньше, чтобы взломать пароль, который соответствует .

Итак, если у вас есть 10 паролей, которые нужно взломать, и все они соответствуют преобразованному словарному слову, вы должны сделать это за час или два. Это нормально? Потому что вы ничего не можете сделать, кроме как распределить эту досадно параллельную проблему по как можно большему количеству узлов и ядер (о, и, в первую очередь, используйте более быструю машину - это может дать вам, возможно, вдвое больше или около того).

Вы не можете добавить уловки глубокой оптимизации, поэтому общая логика будет логикой тройного вложенного цикла: один уровень перебирает зашифрованные пароли, один - слова в словаре, один - варианты каждого. словарное слово. Нет большой разницы в том, как вы вкладываете вещи (за исключением того, что цикл вариантов должен входить в цикл слов для простоты).Я рекомендую инкапсулировать «дайте мне все варианты этого слова» в качестве генератора (для простоты, а не для скорости) и в противном случае минимизируйте количество вызовов функций (например, нет причин использовать эту функцию check_pass , поскольку встроенный код такой же ясный и будет микроскопически быстрее).

2
ответ дан 17 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: