За несколько дней до Международного авиасалона в Фарнборо (FIA) 2018 некоторые подписчики заметили интригующий пост в профиле Airbus LinkedIn.

В последующие дни они опубликовали задания. Ниже я помещаю соответствующие картинки вместе на случай, если читателю будет интересно их решить, прежде чем проверять решения. Мы также найдем ссылки в разделе «Справочная информация» ниже.

Для каждой загадки я написал короткие скрипты Python для их решения, и все они доступны в этом блокноте Google Colab.

День 1: легкий-легкий

Типичная киносцена: по какой бы причине ни потребовалось тайное общение, у героев есть возможность передать как минимум два символа или только один сигнал с разной длительностью; это может быть вспышка, два разных звука или просто точка и тире. Правильно: азбука Морзе. А сайт IMDB действительно составил длинный список фильмов и сериалов в честь мистера Морса.

Закодируем международную азбуку Морзе. Используя словарь Python для сопоставления символов, мы получим:

Это странное расшифрованное сообщение, но в обратном порядке выглядит как URL, так что давайте закончим его:

День 2: Все еще легко

Вероятно, самым первым шифром подстановки, с которым мы знакомимся в курсе информатики, является код ASCII. После этого всякий раз, когда мы видим загадку с последовательностью чисел, мы непременно думаем об ASCII-коде. Но в эту последовательность попали и буквы. Хм… Буквы больше, чем F? Нет. Так что, возможно, числа в шестнадцатеричной системе счисления. Давайте тогда поработаем над этой гипотезой.

Хм… Похоже, координаты на карте. Вставив их в google maps, мы получили координаты Farnborough International Airshow: Lincoln Rd, Farnborough GU14 6BD, UK. ;-) Далее!

День 3: Средний

На первый взгляд это напоминает мне бинарное представление объекта в символах ASCII. Среди алгоритмов для этого самым известным является, вероятно, Base64, который мы можем использовать, например, для встраивания изображения (двоичных данных) в HTML-документ (чистый текстовый файл).

В расшифровке символов изображения есть сложная часть, потому что мы не уверены, какой из них соответствует «вертикальной черте». Будет ли это строчная буква i (например, первая буква слова остров) или заглавная буква i? Число 1 (один)? Нижняя буква "л" (например, первая буква буквы)? Проблема в том, что base64 очень чувствителен к неправильному символу в строке. После нескольких раундов проб и ошибок мы нашли правильную транскрипцию.

Несколько комментариев по этому поводу:

  • После первого декодирования мы заметили, что у нас все еще есть строка, похожая на кодировку base64, поэтому мы продолжили ее декодировать;
  • Функция Python base64 жалуется на заполняющий символ = (это просто символ для заполнения строки до числа, кратного четырем), так что для некоторых итераций мы завершили некоторые '=' в конце концов;
  • Алгоритм преобразует строку в массив двоичных данных, так что возможно, что на выходе будут некоторые небуквенно-цифровые символы. Для них (даже символ новой строки) мы проигнорировали для следующей итерации декодирования.

После пяти итераций мы его взломали!

День 4: Жесткий

Это похоже на нашего дорогого старичка ASCII…

Что насчет этого? Будет ли это снова Base64?

Этот последний, опять же, выглядит как шифр подстановки. И чтобы взломать такой шифр, мы можем начать анализировать наиболее часто встречающиеся буквы или, может быть, слова. Обратите внимание, что последовательность gsv появилась дважды, поэтому мы можем поискать в Google шифр gsv. И первое вхождение дает нам решение: Шифр Атбаша. Очень простой шифр подстановки, в котором каждая буква заменяется соответствующей буквой, если вы пишете алфавит в обратном порядке:

АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ

ZYXWVUTSRQPONMLKJIHGFEDCBA

A заменяется на Z, B заменяется на Y и так далее.

День 5: Супер тяжелый

Это снова похоже на шифр замены. Основываясь на предыдущей задаче, мы могли подумать, что это снова будет шифр Атбаша, но это не так. Существует еще один очень известный шифр подстановки, называемый шифром Цезаря, который заменяет букву своей K-й последующей буквы в алфавите. Например, применив ключ K=2, мы заменим A на C; Б через Д; С на Е;…; Y на А; Z на B. Существует также более сложный способ использования шифра Цезаря, то есть последовательное и многократное использование другого ключа K. Например, используя ключ автобус (каждая буква на самом деле является номером ее позиции в алфавите), чтобы зашифровать сообщение это секрет.

B -> 2

U -> 21

S -> 19

  THIS IS A SECRET
+ BUSB US B USBUSB
= VCBU DL C NXEMXV

Это называется шифром Виженера. Может быть, нам стоит попробовать ключ типа… AIRBUS? (и мы также должны учитывать, что порядковый номер начинается с 0, так что A = 0).

Как и обещал…

Что ж, через несколько дней после отправки им решения в очень коротком сообщении электронной почты я получил этот модный подарок в своем доме :-)

Помните, что все коды Python доступны в блокноте Jupyter по адресу https://colab.research.google.com/drive/1FURFXbAq1Ipum4ZtmYQtmSDCEbSn54Vs.

использованная литература

Рекламный пост: https://www.linkedin.com/feed/update/urn:li:activity:6422813729355767808/

День 1: https://twitter.com/airbuscareers/status/1017047122884087808

День 2: https://www.linkedin.com/feed/update/urn:li:activity:6423178155338661888

День 3: https://www.linkedin.com/feed/update/urn:li:activity:6424213552785162240

День 4: https://www.linkedin.com/feed/update/urn:li:activity:6423582619564412928

День 5: https://www.linkedin.com/feed/update/urn:li:activity:6423838636541902849

Фильмы с использованием азбуки Морзе. https://www.imdb.com/search/keyword/?keywords=код Морзе&sort=moviemeter,asc&mode=detail&page=1&ref_=kw_nxt

Международный код Морзе. https://morsecode.world/international/morse2.html

Подстановочный шифр. https://en.wikipedia.org/wiki/Substitution_cipher

Шестнадцатеричная запись. https://en.wikipedia.org/wiki/Шестнадцатеричный код

Шифр Виженера. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher