Три недели назад я опубликовал статью-загадку «Шифр, который разгадал только один программист из всей компании. А вы сможете?». Вариантов задачи было три, первым трём отгадавшим полагались всяческие ништяки. В комментариях сразу пошло активное обсуждение задачи: читатели размышляли, в какую сторону двигаться, что означают цвета, и делились подсказками — например, как выглядит шифр, если его перевести в восьмеричную и десятичные системы.
Первый правильный ответ появился через 8 часов после публикации: шифр отгадал Wigaro из Москвы. Следующие ответы появлялись по одному в день: на второй день отгадал AlexKarpan из Киева и на третий — GruBBy_kz из Караганды.
В комментариях к статье спрашивали, как же решается эта загадка. Как выяснилось, читатели даже писали в личку победителям, потому что «не могли уснуть» без решения.
Мы созвонились с победителями и обсудили, как они решали задачу и какие у них впечатления. Даём разгадку.
О победителях: бэкграунд, почему решили поучаствовать
Wigaro, Москва, разгадал первым:
«Задача интересно и красиво выглядела. Я сразу понял, как её решать. Если бы загадка была связана именно с цветом — что надо как-то выделять цвета, как думали в комментариях — я бы сразу бросил, это слишком сложно. А тут я сразу подумал: „О, что-то бинарное, клёво, можно попробовать".
Для меня вся эта битовая репрезентация данных — это автоматический навык. А первые два шага здесь — они по сути бинарные. Их я практически решил в голове. К тому же я работаю в компании, которая занимается квантовой криптографией, и интересовался шифрами. Сразу понял, что в конце будет какой-то простой шифр: либо Цезаря со сдвигом, либо Виженера. В итоге все эти шифры перебирал, правда, ключ неправильно оценил.
На решение потратил около 7 часов 45 минут с перерывом на обед и на работу».
AlexKarpan, Киев, разгадал вторым:
«Я любитель головоломок. Не спец в теории, но спец в практике. Мне тоже задача показалась дружелюбной — отличная идея с цветами. Эстетически приятно, интересно, кажется, что просто.
Решал-решал, уже пора спать, а сна ни в одном глазу: всё мучался, ну как же её решить. Только решил забить и всё-таки пойти спать — осенило, как надо сделать. С утра проснулся, никакого кофе, открыл комп — и дальше давай решать.
Помогло, что первый человек решил: уже была подсказка и стало понятно, что решить задачу возможно.
Чистого времени потратил часов 7».
GruBBy_kz, Караганда, разгадал третьим:
«У меня живой интерес ко всякому такому: я не специалист ни в шифровании, ни в программировании, но ещё с тех времён, когда интернет был чем-то далёким, я открывал HIEW и заглядывал в бинарники и ресурсы игр, программ, DOS/WIN311.
Полночи я читал Хабр. Дочитал до этой статьи. Мне понравились внешний вид и презентация загадки: свежие симпатичные цвета, выглядело не пугающе. К этому моменту на задачку уже было два ответа. Я постарался не откладывать её на следующий день: вдруг кто-то раньше меня угадает. И занялся ей до утра. Потом немного поспал, не выспался, встал и дорешал.
Изначально задача показалась дружелюбной, потом очень сложной, а потом вновь простой — уже когда я её решил. Решение заняло часов 8–10, если не считать работу мозга во сне».
Разгадка шифра
Уровень 1: преобразовать цвета из RGB и получить бинарные числа в формате blue=001
Wigaro, Москва:
«Я прочитал все подсказки. По шифру видно, что во фразе 4–5 слов, они не в инвертированном порядке, потому что есть короткое слово — предлог: это может быть, например, «не». Группы полос по длине визуально похожи на слова.
Поначалу можно понять, что там 8 цветов: если что-то равно степени двойки, это неспроста. Открываешь карту RGB, сопоставляешь цвета, видишь 00FF0FF0FFFF — это биты. Переводишь в биты, получаешь восьмеричную систему с цифрами. Цифры пишешь на бумажку.
Пример данных на этом этапе: «010111000001100000001000000010110000010110000010110000010000010100000001101000010111000000000111000001001000010110000010000000010100000010000000010110000000000010110000010100000010000000010110000011010000001101000101000000000001011000000000101000001101000001111000010101»
AlexKarpan, Киев:
«Прочитал, что будет 5 преобразований: ну понятно, надо зеркально отразить, инвертировать цвета — всё просто. Потом подумал: не может же быть настолько просто. Значит, надо разбить на три канала RGB — для этого воспользовался онлайн-сервисом. Начал писать конвертер, который по битам всё это разбирает.
Вспомнил про подсказку „не усложнять". А потом увидел фразу, которую разгадал Wigaro: „Оцениваю задачи пальцем в небо". И по дыркам между словами прям видна эта концовка „в небо". Понял, что можно выкинуть переворачивание, сложить по битам, и посмотреть, что получается. И пошло. Спасибо первопроходцу».
GruBBy_kz, Караганда:
«Сбивало с толку, что в задаче пять слоёв преобразования. Битовую карту, соответствие, маппинг цветов я сразу не раскусил, понял через 4 дня после решения. Подобрал по другим принципам.
Посчитал цвета: там их 7–8, считать чёрный или не считать. Пять слоёв преобразования. Перед тем как приступить к решению зарядил голову вероятными алгоритмами, которые придётся применять.
Потом заметил, что цвета одиночные. Двойные полоски следуют только после одинарных цветных, и их мало. Увидел, что двойные полоски начинаются в основном с синей и зелёной, и только две из них — с голубой. Я подумал, что сначала должны идти одноразрядные-одноцветные цвета. Потом двухцветные. Чёрный встречается всего три раза: один раз с голубым, один — с зелёным: он, скорее всего, старший бит. Значит, первые цвета — зелёный и синий (какой вперед — непонятно). Таким образом получил карту — правда, она оказалась с ошибками — кодированных цветом букв, от младших к старшим. Получается, тут я пропустил второй уровень».
Уровень 2: понять, как бинарные числа соединить и разбить на числа
Появляется строка в формате 001. Дальше нужно понять, как бинарные числа соединить и разбить на числа, и понять в чём роль чёрного цвета.
Wigaro, Москва:
«Было понятно, что чёрный цвет — разделитель букв. Если три чёрных подряд — это два разделителя букв и пробел. Также есть числа, оканчивающиеся на ноль: 10 и 20. То есть чёрный должен быть нулём — чтобы можно было все буквы представить из алфавита.
Вот пример. Пробел — разделение символов, перевод строки — разделение слов:
27 14 10 26 26 26 2 24 15 27
7 11 26 20 24 20 26
26 24 20 26 32 15 5
13
5 15 17 25
Довольно понятная логика, если посидеть над этим два часа».
Уровень 3: перевести числа в буквы по порядку, где 1=А
Wigaro, Москва:
«То, что там зашифрованы слова, было понятно сразу. Я застопорился на моменте, когда получил цифры. В первом варианте у меня получилось максимальное число 32 и я подумал, что это номера русских букв без ё. Потом подумал, что это какая-то кодировка: перебрал все кодировки, ничего не подходило. Решил взять цифры по 3 бита, перекодировать по 4 бита и представить в шестнадцатеричном виде, но и так никакой кодировки не оказалось.
Я подумал: что если предположить, что система счисления восьмеричная и ее надо перевести в десятичную? 32 как раз удобно отображается в 26 — это число букв в английском алфавите. Понятно, что вы не могли вставить дурацкий шифр, который состоит из цифр, а не букв. Никто бы это не решил.
Перевод в десятичную, предполагая, что исходная — восьмеричная, выглядит так:
23 12 8 22 22 22 2 20 13 23
7 9 22 16 20 16 22
22 20 16 22 26 13 5
11
5 13 15 21
Перевод в буквы (1-A, 2-B … 26 — Z):
wlhvvvbtmw givptpv vtpvzme k emou».
AlexKarpan, Киев:
«Потерял много времени с русским языком, когда думал, что восьмеричные числа от 1 до 32 — это десятичные номера букв русского алфавита без „ё". Долго копался с надписью, пока до меня не дошло, что надпись транслитерацией: английскими буквами русская фраза».
GruBBy_kz, Караганда:
«Если вы видели мой коммент с решением, первое решение дал неверное [„смело правлю базу сразу на продах" вместо „смело правлю баги сразу на живом" — прим. ред.]. Не раскусил эту часть полноценно. В статье написали, что где-то придётся подумать, а где-то повозиться: я принял это за призыв к брутфорсу. Перебором нашёл значения битов, которым соответствуют цвета в алфавите.
На той машине, где я сейчас работаю, нет IDE. Поэтому я открыл REPL.it в онлайне, надёргал туда блоков, кусков, функций, алфавитов, которые потом применял. В итоге половину сделал на Python, половину в голове».
Уровень 4: расшифровать с помощью Виженера с ключом iSpringTech
Wigaro, Москва:
«Я ужасно затупил с ключом. У меня не подходил шифр Цезаря, я сидел и думал, зачем на футболке нужна надпись iSpring Tech. Потом взял шифр Виженера и попробовал там применить эту надпись как ключ.
Я ещё думал, что „spring" — это ручей, ключ. Что сам ключ — это Tech, и надо его перевести на русский или написать полностью — technology. Но потом понял, что, надо использовать надпись iSpring Tech целиком. И тогда всё сошлось, решилось быстро. Переход от Tech до надписи целиком занял примерно два часа.
Ответ: otsenivaiu zadachi paltsem v nebo».
AlexKarpan, Киев:
«У меня не сходилось количество букв. Я думал, ну ладно, в надписи iSpring Tech есть пробел, пробел это маска, которую можно просто выкинуть. Потом уже я догадался, что записано латиницей.
После предыдущих преобразований я получил зашифрованную первую фразу „WLHVVVBTMW GIVPTPV VTPVZME K EMOU" и пытался понять, как из нее сделать ожидаемый результат: „OTSENIVAYU ZADACHI PALTSEM V NEBO", который уже разгадал первый победитель. Вывел таблицу: сумма букв, разница, XOR. Полчаса на неё смотрел, думаю, ладно, сдаюсь.
Уже собрался закрывать таблицу и вдруг замечаю, что разница между первыми шифрованными и нешифрованными буквами — 8. Думаю, подождите, это ж похоже на порядковый номер буквы „i". Смотрю, следующая разница — минус 11: 26 минус 11 равно 15. Это буква „s". Так, подождите. Волшебный момент, когда дописал строчку кода, нажимаю и бам: появляется эта фраза».
GruBBy_kz, Караганда:
«Над последними слоями долго не думал: я немножко знаком с шифром Виженера. В одном из шифров на футболке идут три жёлто-зелёные полосы подряд и потом ещё две. Одинаковые буквы часто появляются в результате обработки Виженером. Поэтому тут уже подсказка из видео стала абсолютно понятной.
Но, как видно из моего первого, не до конца верного ответа, у которого только первые слова совпали, ошибка была в самом первом слове — в соответствии весам каждого цвета в таблице.
Я потратил время, чтобы понять, какие алгоритмы могли быть применены. Допустим, надпись iSpring Tech содержит 7 и 4 букв: может, это 74, и надо всё поксорить на 74? Теорий было много лишних.
Когда уже понял, что это шифр Виженера и что ключ iSpring Tech отсылает к латинице, шаг с транслитом я раскусил быстро».
Уровень 5: перевести полученную фразу на русский язык
Wigaro, Москва:
«Получил ответ, подумал, что клёво, самоутвердился, жене расскажу».
Шифр, который отгадал Wigaro: «Оцениваю задачи пальцем в небо»
AlexKarpan, Киев:
«Когда на пальцах посчитал первые 4 разности и понял, что совпадает с „i", „s", „p", „r", я понял, что всё получилось: это ключ, и шифр раскроется. Я встал с постели, стал бегать, прыгать по дому, рассказал домашним, что я, скорее всего, решил — сейчас пойду сделаю последний шаг. Испытал прилив дофамина, чувство открытия, выдохнул. Большая часть мозга, которая была занята, освободилась.
Шифр, который разгадал AlexKarpan: «Сегодня я занимаюсь рефакторингом»
Спасибо за задачу: это было круто. Классно, что можно было решить задачу всего за 8 часов. Потом удовольствие повторялось, когда писали в личку: „Как же всё-таки решить? Пожалуйста, подскажите".
Кто-то сказал про Виженера — но я теорию плохо знаю. Получается, придумал очевидную вещь. Потом почитал — видимо, подсказка была про него».
GruBBy_kz, Караганда:
«У меня была похожая реакция, как у AlexKarpan. Рассказал жене и ребёнку про статью и про задачку ещё в начале, поэтому они меня поддерживали. Вроде бы я его успел решить третьим, результата ждали все вместе».
Шифр, который отгадал GruBBy_kz: «Смело правлю баги сразу на живом»
_____
Благодарим всех за участие! Мы безумно рады, что так много людей в него включилось :)
Особенное спасибо первым трём разгадавшим, которые не сдались и добили эту загадку. Они получат такой набор:
Набор состоит из футболки и сувенирно-съедобного набора «Марий Эл»