Алгоритм, необходимый для генерации комбинаций сдвинутых символов

Я знаю точную последовательность и длину пароля моего раздела TrueCrypt, но я не могу вспомнить, какие символы были сдвинуты вверх с помощью клавиши Shift. Я написал Perl-скрипт (например, CrackTC), который просто пробует все пароли из файла, но я ищу алгоритм для быстрой генерации файла паролей. Пароль состоит из 42 символов, поэтому любые советы будут вам полезны.

Я понял, что у меня будут только сдвинутые цифры и знаки препинания, поэтому нужно изменить только 17 символов.

Обратите внимание, что это не домашнее задание.

5 ответов

Решение

Быстрый скрипт на Python:

def isShiftable(c):
    return not c in "123456789"

def generate(str, i=0):
    if len(str) <= i:
        print "".join(str)
    else:
        if isShiftable(str[i]):
            str[i]=str[i].upper()
            generate(str, i+1)
            str[i]=str[i].lower()
            generate(str, i+1)
        else:
            generate(str, i+1)

generate(list("testit123"))

Я уверен, что это можно почистить и сделать менее плохим, но этого должно быть достаточно.

Для 17 перемещаемых символов должно быть 131072 возможностей. Кроме того, вам нужно определить свою собственную "верхнюю" / "нижнюю" функцию для смещения знаков препинания.

Поскольку каждый символ может быть верхним или нижним, это эквивалентно одному биту. У вас есть 42 бита. Посчитайте в двоичном формате и установите символ в верхний или нижний регистр в соответствии с шаблоном двоичных битов. 2 до степени 42 это очень большое число! Слишком большой, чтобы найти грубой силой! Удачи!

Предполагая, что вам нужно попробовать все комбинации, и что каждая попытка пароля отделяется одним символом, файл пароля для всех возможных прописных букв 42-символьного пароля будет иметь длину 189 терабайт. Вы, вероятно, не хотите работать напрямую из файла.

Алгоритм, который я выбрал бы, является двоичным алгоритмом подсчета, но вместо переключения одного бита, переключайте заглавные буквы одного символа. Я бы настоятельно рекомендовал сузить пул с эмпирическими правилами, которые вы помните (например: определенно было более 5 прописных и менее 40 прописных).

Не совсем ответ, но это может уменьшить ваше пространство поиска:

  • Минимум и максимум заглавных букв (может быть 4 и 10)
  • Минимальная и максимальная последовательность прописных букв (также может быть 1 и 1)
  • Минимальная и максимальная последовательность строчных букв (может быть 2 и 15)
  • Некоторые комбинации более вероятны, чем другие, и должны быть проверены в первую очередь. Например, групповые комбинации по максимальной последовательности заглавных букв и сначала проверьте те из них, у которых минимальное значение.

42 буквенный пароль, и вы знаете буквы, то есть 2^41 (то есть: 2 199 023 255 552) уникальные комбинации. Если бы вы могли проверить 10 м из них за 1 секунду, то вы могли бы перебором - и это заняло бы по крайней мере: 61 час 5 минут 2 секунды.

Скорее всего, вам не придется много работать. Пусть х будет количеством заглавных букв:

  • Если у тебя есть 7 > x заглавные буквы: (42!)/(6! 36!)+(42!)/(5! 37!)+(42!)/(4! 38!)+(42!)/(3! 39!)+(42!)/(2! 40!)+(42!)/(1! 41!) = 6 220 767 комбинации.
  • Если у тебя есть 6 < x < 9 заглавные буквы: (42!)/(8! 34!)+(42!)/(7! 35!) = 145 008 513 комбинации.

Если вы можете автоматизировать процесс проверки и проверить 2000 элементов в секунду, то в худшем случае:

  • Если у тебя есть 7 > x заглавные буквы, это займет: 51,84 минут
  • Если у тебя есть 6 < x < 9 заглавные буквы: 20,14 часа

Скорее всего, вам нужен какой-то особый алгоритм перестановки для эффективного поиска уникальных элементов. Это довольно сложная проблема, но я не вижу другого пути, так как итерации по 2 ^ 41 элементам - чокнутые.

Другие вопросы по тегам