Что такое эффективный способ написания алгоритма взлома пароля (Python) - PullRequest
6 голосов
/ 24 мая 2010

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

Назначение состоит в том, что с учетом трех различных функций, которые преобразуют строки из их обычного регистра во все различные сочетания заглавных букв, преобразует букву в число (если оно выглядит одинаковонапример, 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

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

Ответы [ 2 ]

3 голосов
/ 24 мая 2010

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

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

2 голосов
/ 24 мая 2010

На моем медленном ноутбуке, 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, поскольку встроенный код простокак ясно, и будет микроскопически быстрее).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...