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