Код: Выделить всё
output = [[10, 'HELLO', 'ABCD'], [10, 'HELLO', 'ABDC'], [18, 'HLELO', 'BCDA']]
Хорошо, Hillclimber работает над простым сообщением замены (a=h, b=x, c=m и т. д.). Для коротких открытых текстов не все буквы алфавита появляются в зашифрованном тексте. Что я делаю, так это идентифицирую уникальные буквы в зашифрованном тексте, помещаю их в начало списка, а затем дополняю список оставшимися недостающими буквами. Альпинист случайным образом распределяет буквы открытого текста во втором списке и пытается расшифровать сообщение, используя два алфавита. Если шифралфавит использует только 18 букв из-за того, что сообщение короткое, то только первые 18 букв в этом списке имеют значение, так что что-то вроде
'JOHNABCDEFGIKLMPQRZYXSTUVW'
и
'JOHNABCDEFGIKLMPQRWVUSTZXY'
выдаст тот же "открытый текст" с той же самой ngram имеет значение. Я сортирую по количеству нграмм, чтобы получить 200 лучших результатов, которые наиболее близки к нормальному распределению частот на английском языке, и мне нужна только одна копия каждого сообщения, чтобы увидеть, правильная ли это расшифровка или нет. Я хочу отбросить повторы.
Поскольку неиспользуемые буквы необходимы для простого шага замены, мне нужно сохранить их в списке шифралфавита, но неиспользуемые буквы не способствуют восстановлению ключа шифра (мне нужно только «ДЖОН» из приведенного выше примера, чтобы узнать, каким был настоящий ключ). Это означает, что не имеет значения, какой из двух алфавитов я оставлю после уникальной сортировки, поскольку от каждого нужны только первые 18 букв. А поскольку в примере первые 18 букв дают две идентичные расшифровки, количество нграмм (то есть количество раз, когда в результате появляются общие группы букв, такие как «ed», «er», «ing») будет идентичным.
Мобильная версия