Три недели назад я опубликовал статью-загадку «Шифр, который разгадал только один программист из всей компании. А вы сможете?». Вариантов задачи было три, первым трём отгадавшим полагались всяческие ништяки. В комментариях сразу пошло активное обсуждение задачи: читатели размышляли, в какую сторону двигаться, что означают цвета, и делились подсказками — например, как выглядит шифр, если его перевести в восьмеричную и десятичные системы.


Первый правильный ответ появился через 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: «Смело правлю баги сразу на живом»

_____

Благодарим всех за участие! Мы безумно рады, что так много людей в него включилось :)
Особенное спасибо первым трём разгадавшим, которые не сдались и добили эту загадку. Они получат такой набор:



Набор состоит из футболки и сувенирно-съедобного набора «Марий Эл» 

Комментарии (4)


  1. RainbowJose
    23.11.2021 10:38

    А мясо лося - это не опасно?


    1. skymal4ik
      23.11.2021 11:58

      Не думаю. У нас в Эстонии популярны и консервы, и колбасы, и прочие деликатесы из диких животных - лось, медведь, кабанчик и так далее. Страшных историй про отравления не слышал, сам ел, было интересно попробовать.


  1. AlexKarpan
    23.11.2021 14:18
    +1

    Спасибо еще раз за отличную задачу! Ну и за приз! :)


  1. GruBBy_kz
    24.11.2021 00:55

    Ждём новых ребусов!!

    Хорошо бы несколько задачек разной сложности, - может кто-то хотел бы 30 минут потратить а не целый день. (хоть автор и не может никак, кроме как статистически, оценить, сколько у среднего айтишника задача может отнять времени)