По сути, мой друг заперся в зашифрованном контейнере, который он создал. Должно быть, он сделал опечатку при вводе своего пароля, потому что он не может получить доступ к контейнеру. Мы знаем, каким он должен быть, и реальный пароль наверняка будет его вариантом и / или очень похож на него. Я ищу код или технический документ, касающийся этого понятия «нечеткого» взлома пароля с учетом известной части пароля или известного шаблона, которому следует пароль. Язык не важен. Я уже разработал способ подбора пароля, но мне нужно разработать алгоритм, который позволит мне разумно попытаться взломать его, чтобы мне не приходилось пробовать каждую возможную комбинацию. Я думаю, что кто-то другой уже сделал это, однако. Я до некоторой степени понимаю концепции, стоящие за этим, но ищу код или технический документ, где кто-то уже мог решить эту проблему.
UPDATE
Поэтому я создал словарь (Python, но не стесняйтесь присылать примеры на любом языке), используя символы, которые могут быть в парольной фразе. При этом учитывались близость нажатия клавиш на стандартной клавиатуре QWERTY, 1337 эквивалентных слов и случайный символ «/» для каждой буквы, поскольку она находится рядом с клавишей Shift. Оттуда предоставляется образец парольной фразы и пробуется каждая буква. Это следующий пример: http://code.activestate.com/recipes/535171-password-cracker/
import os
from commands import getoutput
known = {
'_': ('_', ' ', '-', '.', '/'),
'b': ('b', 'B', '3', '8', '*', 'v', 'V', 'n', 'N', 'g', 'G', 'h', 'H', ' ', '/'),
'g': ('g', 'G', '6', '^', 'f', 'F', 'h', 'H', 'b', 'B', 'v', 'V', 't', 'T', '/'),
'l': ('l', 'L', '1', '!', ';', ':', 'k', 'K', 'o', 'O', '.', '>', ',', '<', 'p', 'P', '/'),
'e': ('e', 'E', '3', '#', '4', '$', 'r', 'R', 'w', 'W', 'd', 'D', '/'),
'h': ('h', 'H', '4', '$', 'g', 'G', 'j', 'J', 'y', 'Y', 'b', 'B', 'n', 'N', '/'),
'i': ('i', 'I', '1', '|', '!', '\\', 'u', 'U', 'o', 'O', 'k', 'K', '8', '*', '9', '(', '/'),
't': ('t', 'T', '7', '&', '+', 'r', 'R', 'y', 'Y', 'g', 'G', '4', '5', '%', '6', '^', '/'),
'r': ('r', 'R', 'e', 'E', 't', 'T', 'f', 'F', '4', '$', '5', '%', '/'),
}
command = 'open-sesame %s' # hey, use your imagination ;)
# I obviously supplied only needed letters for this example, I can't tip you
# off to the real pass phrase ;) This conveys the general idea....
passwdBasic = 'Big_Leg_Hitter'
def main():
arrays = [known[ltr] for ltr in passwdBasic]
start = [ltrs[0] for ltrs in arrays]
end = [ltrs[-1] for ltrs in arrays]
indexes = [0] * len(arrays)
maxes = [len(ltrs)-1 for ltrs in arrays]
chrs = [ltrs[i] for ltrs, i in zip(arrays, indexes)]
while chrs != end:
passx = ''.join(chrs)
open('tries.txt', 'a+').write(passx + '\n')
out = getoutput(command)
if 'wrong password' not in out:
print 'GOT IT!', passx
return
# Next letter
for i in range(len(indexes)-1, -1, -1):
if indexes[i] <= maxes[i]-1:
indexes[i] += 1
break
else:
indexes[i] = 0
# Make up the chrs
chrs = [ltrs[i] for ltrs, i in zip(arrays, indexes)]
if __name__ == '__main__':
main()
Вымышленный «open-sesame» - это модифицированная утилита, которая монтирует этот конкретный тип зашифрованного тома, он не был написан на python, но был превращен в инструмент командной строки, чтобы этот скрипт мог взаимодействовать с ним.
Пара задач / направления исследований:
- Если бы символ '/' был случайно нажат вместо клавиши Shift, это фактически добавило бы символ к парольной фразе и, таким образом, могло появиться перед любой из букв. Это необходимо учитывать в решении.
- Было бы неплохо интегрировать это с утилитой проверки орфографии, предложенной @rrenaud: http://norvig.com/spell-correct.html
- Я восхищен применением Теории вероятностной статистики Байя, которая была применена для решения проблемы проверки орфографии; Мне интересно, есть ли какое-либо исследование о ошибочных нажатиях клавиш и вероятности попадания одних клавиш над другими при наборе определенных слов и / или фраз. Эта логика может быть применена к взлому паролей почти таким же образом, как утилита проверки орфографии, которая использует известные списки распространенных орфографических ошибок. У меня нет ошибочных данных о нажатиях клавиш, с помощью которых можно «обучить» утилиту нейронной сети.
Я ценю всю огромную помощь, я просто хотел поделиться тем, где я сейчас нахожусь, для всеобщей пользы.