Найти в Дзене

Как стать Штирлицем. Дешифровка на Python

Штирлиц идет по коридору. По какому коридор? По нашему коридору! Помните этот знаменитый диалог из фильма "17 мгновений весны"? Но речь в статье пойдет не о фильме а о том, как Штирлиц расшифровывал радиограммы, которые он получал из центра. Итак, Штирлиц приходил со службы, отпускал служанку и ровно в 7 часов вечера включал приемник, настраивал его на какую то волну и слушал как женский голос сухо, четко передавал какие то цифры для геологической партии, затерянной в далекой Сибири. А Штирлиц записывал эти цифры группами по 4 в столбик. А потом брал с полки какую то книгу, раскрывал на определенной странице и цифры превращались в слова а слова в текст задания. На самом деле это пример одного из самых криптостойких шифров - словарного. Текст на странице служит своеобразным "словарем". Где положение конкретного слова определяется номером строки и положением слова в строке. А цифры, которые записывал Штирлиц как раз и являются номером строки и номером слова в строке. Раскодировать такой

Штирлиц идет по коридору. По какому коридор? По нашему коридору! Помните этот знаменитый диалог из фильма "17 мгновений весны"? Но речь в статье пойдет не о фильме а о том, как Штирлиц расшифровывал радиограммы, которые он получал из центра.

Итак, Штирлиц приходил со службы, отпускал служанку и ровно в 7 часов вечера включал приемник, настраивал его на какую то волну и слушал как женский голос сухо, четко передавал какие то цифры для геологической партии, затерянной в далекой Сибири.

А Штирлиц записывал эти цифры группами по 4 в столбик. А потом брал с полки какую то книгу, раскрывал на определенной странице и цифры превращались в слова а слова в текст задания.

Кадр из фильма "семнадцать мгновений весны"
Кадр из фильма "семнадцать мгновений весны"

На самом деле это пример одного из самых криптостойких шифров - словарного. Текст на странице служит своеобразным "словарем". Где положение конкретного слова определяется номером строки и положением слова в строке. А цифры, которые записывал Штирлиц как раз и являются номером строки и номером слова в строке.

Раскодировать такой шифр не имея на руках "словаря" практически невозможно. А если учесть, что словарем может служить не одна страница а несколько, которые меняются по определенному, заранее неизвестному, алгоритму то на расшифровку могут уйти годы. Немного спасает ситуацию частотный анализ, о котором я напишу позднее, но для этого нужен текст десятков перехваченных шифровок!

Дешифровка по словарю операция достаточно длительная и нудная. Можно ли ее автоматизировать силами языка Python? Несомненно. Словарем может быть любой текстовый файл, самый безобидный. И никому в голову не придет что он - ключ к тайнам Штирлица.

Для начала из текста файла нужно создать таблицу, двумерный массив, в котором строка файла разбивается на слова. На Python это записывается все в 3 строчки:

  1. lines = [] // создаем пустой массив слов
  2. for line in open("test.txt"): //читаем строку текста
  3. lines.append(line.split() //разбиваем ее на слова и добавляем к словарю. Вуаля!

Казалось бы все просто, но не совсем. Дело в том, что метод .split() в качестве символа разделителя по умолчания использует пробел. А значит, что все точки, запятые и другие знаки препинания останутся в словах. Конечно, можно договориться не использовать их в шифрограммах, но для гарантии нужно от них избавляться.

Честно говоря, я долго ломал голову над этой проблемой, перепробовал несколько вариантов алгоритмов, но пока родил вот это:

  1. s = [".",",",":", "!", "?", ";"]
  2. lines = []
  3. for line in open("test.txt"):
  4. for sep in s:
  5. i = 0
  6. while i < len(line):
  7. if line[i] == sep:
  8. line = line[: i] + line[i+1 :]
  9. i +=1
  10. lines.append(line.split())
  11. print(lines)

Получилось конечно громоздко и топорно, совсем в духе старичка Pascal -а, но что делать, старые привычки дают о себе знать. Да и я пока еще не волшебник а только учусь. Но код рабочий. А если среди вас есть истый питонист, напишите в комментариях свое решение, думаю всем будет интересно!

Теперь осталось расшифровать сообщение. Оно вводится в виде: "rrcc rrcc rrcc и т.д. Где rr - номер строки а cc номер колонки. Причем в группе должно быть 4 знака! Например 1-я строка это 01, нулевая 00 и т.д. А вот код для дешифровки:

  1. l = input("Введите шифровку")
  2. codes = l.split()
  3. secr = ""
  4. for code in codes :
  5. # secr = secr + str(lines[int(code[: 2])][int(code[2 :])]) + " "
  6. row = int(code[: 2])
  7. col = int(code[2 :])
  8. print(lines[row][col])

Вот и все! Кстати, обратите на границы диапазонов в стр. 6 и 7. Это не ошибка! В Python нижний интерпретируется как "включительно" и 2 в стр. 7 и есть 3 - й символ в коде (индекс строки начинаются с нуля!) А вот верхний как "исключительно" и в стр. 6 двойка на самом деле это единица и никакой путаницы нет! И так постоянно наступаешь на мелкие грабли и они очень больно бьют по лбу или куда они там достают. :)

Обратите внимание на закомментированную 5 - строчку. По моему мнению тут все абсолютно правильно! А вот у интерпретатора на сей счет другое мнение, противоположное. Почему он выдает ошибку совершенно не понимаю! Ведь все же правильно! Или нет? Если вы хорошо разбираетесь в python, напишите в комментариях в чем тут проблема?

Вот так легко и просто решаются проблемы дешифровки на языке python. Ну а теперь достаем радиостанцию, прогреваем лампы и ... Юстас Алексу!

Обязательно поставьте ЛАЙК если статья была интересна и полезна!

Напишите свое мнение в комментариях!

Подпишитесь на канал!