Всем привет! С приближением Нового года мы запускаем IT-челлендж, чтобы размять мозги перед праздничным отдыхом. Мы подготовили для разработчиков интересную загадку, которая потребует всей вашей логики и смекалки. Тот, кто решит эту задачу первым и представит элегантное решение, получит главный приз: годовой Telegram Premium (или ~2500 звёзд)!
Суть задачи: перед вами зашифрованная строка, нужно превратить её в осмысленное сообщение, придётся написать собственное решение и разобраться, что именно перед вами за шифр. Не всё так просто.
2E3GX3C3U93E4JK545I35M69L6Q6N78F91PAF9D0CED0GEAF91GQHZRJ6K95LON1TN4QB2S0TMVVR
Чтобы ваше решение было засчитано:
Оформить решение в виде кода (скрипт на любом языке, выполняющий расшифровку);
Расшифровать и указать итоговое осмысленное сообщение;
Разместить код и результат в репозитории (GitHub / GitLab / GitVerse и т.д.)
Подробное описание задания, официальные подсказки и обсуждение подходов мы публикуем в отдельном топике нашего Telegram-сообщества Open Source программистов. Там же можно следить за апдейтами по челленджу и идеями участников.
Отдельная благодарность @whoissoeeA за идею задачи, её подготовку и помощь в организации конкурса.
Комментарии (36)

eimrine
14.12.2025 13:59Я вижу что есть все символы 0-9 и все буквы кроме Y, W. Скорее всего какой-то base-36. Исходя из того что есть нуль и буква O, эта кодировка применена не для человекочитаемости. Может быть, какое-то хитрое представление чего-то известного вроде числа PI - но наличие такого большого количества возможных символов не похоже не рандомный выхлоп. Возможно эту строку нужно как-то нарезать на подстроки которые гуглятся. И почему это именно для разработчиков, почему не для математиков/криптографов?

GennPen
14.12.2025 13:59И почему это именно для разработчиков, почему не для математиков/криптографов?
Потому что дальше не математическая/криптографическая задача.
Да и кодирование в base** это не криптография, а способ предоставления информации в другой размерности.

eimrine
14.12.2025 13:59дальше не математическая/криптографическая задача.
Откуда вам это известно?
а способ предоставления информации
Что-то я не вижу никакой информации в строке
"2E3GX3C3U93E4JK545I35M69L6Q6N78F91PAF9D0CED0GEAF91GQHZRJ6K95LON1TN4QB2S0TMVVR".Всего лишь 77 чисел с повторами.

DFH
14.12.2025 13:59Недавно попадалась публикация на Хабре, еще времен пещерного периода, о сложности восприятия текстовой информации набранной заглавными буквами)

Sudeka
14.12.2025 13:59Если не затруднит, ткните пожалуйста носом (в ссылку). Не нашел, а интересно.

DFH
14.12.2025 13:59Пожалуйста, журнал помнит все: "Почему текст, набранный заглавными буквами, трудно читать" - https://habr.com/ru/articles/103659/

10ball
14.12.2025 13:59С учетом того, что это base36, то энтропия преобразованного сообщения в байтах ~ 232 бита ( AES-256 , к примеру, это 256 битов и он ломается только квантовым компьютером ).
Есть предположение, что это на 70% шифр XOR с ключом L=7. Но даже перебор ключа это ~ 2^56 вариантов.Результаты нейросети :/

eimrine
14.12.2025 13:59энтропия преобразованного сообщения в байтах ~ 232 бита
Так в байтах или в битах?
Никакого AES тут не может быть никак, ведь это шутка а не кусок переписки Павла Дурова. Может быть, какой-нибудь шифр Цезаря.
L может быть и 11 тоже.

10ball
14.12.2025 13:59base 36 раскладывается на строку из байтов, а ее энтропия измеряется битами. А метод Казински показал, что L скорее всего 7 или 14 :)
Это и не AES , это сравнение с AES, чтобы наглядно понять, что энтропия сравнима с промышленным стандартом

10ball
14.12.2025 13:59кстати, там ребята расшифровали уже и все оказалось еще сложнее) нужно было изначальное сообщение очистить от шума, потом бейс36, потом пройтись квадратичной функцией и потом применить шифр Цезаря со сдвигом
Так что мой расчет неправильный :)

eimrine
14.12.2025 13:59Пусть весёлый тамада телеграмм-группы сделает просмотр его ресурса без регистрации и без смс хотя бы на время интересного конкурса - тогда я смогу ознакомиться с прогрессом других участников, с подсказками и с результатом конкурса в целом. Некоторые каналы в телеге ведь можно читать без регистрации и смс. Всё-таки, я - хабраюзер, читающий статью на Хабре и имеющий права писать комментарии на Хабре.
Чем там мог быть полезен метод Касински мне не понятно - в шифротексте повторяется только "D0" и "V". Что там можно чистить от шума в такой короткой строке - тоже не понятно.
base 36 раскладывается на строку из байтов, а ее энтропия измеряется битами.
Но ведь base36 можно разложить ещё и на биты, а энтропию можно посчитать ещё и в байтах. Энтропия строчки из 77 символов равна либо семидесяти семью байтам (77 * 1), либо триста сорока шести с половиною байт (36 * 77 / 8). Как прити к энтропии в 232 бита мне непонятно.

10ball
14.12.2025 13:59исходная строка base36 - декодировали в 56 байт
энтропия Шеннона для этих 56 байт ~ 4.2 бит/на байт
общая энтропия сообщения 4.2×56 = 235 бит ( 232 было округлением )
эти 235 бит не мера криптостойкости, а мера неопределенности данных
у нас 235 бит значит данные не полностью случайны - в них есть избыточность/структура
вывод: 235 бит энтропии это не реальная криптостойкость сообщения, а статистическая мера данных. И это случай, когда энтропия вводила в заблуждение, так как данные были структурированным текстом, замаскированным шумом и преобразованиями
что касается шума в строке - там каждый 5 символ это буквально шум, что написано в подсказке в тг
внимательно посмотрите на декодированную бейс36 строку. метод Касински обнаружил повтор в 9 байт, расстояние между повторами 14 байт. вывод L= 1, 2, 7, 14 ( множители числа 14 ). Вероятнее всего был ключ 7, но если бы это был XOR, который я предполагал изначально. Но это не XOR, а кастомный шифр, который без подсказок в тг решался только брутфорсом

OldMamont
14.12.2025 13:59encrypted_text = "2E3GX3C3U93E4JK545I35M69L6Q6N78F91PAF9D0CED0GEAF91GQHZRJ6K95LON1TN4QB2S0TMVVR"
alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
key_hex = "6ce0acaddfdbbf41a511bfa8f3007a983ade5a"
key = bytes.fromhex(key_hex)def base36_decode(s, alphabet):
num = 0
for ch in s:
num = num * 36 + alphabet.index(ch)
return num.to_bytes((num.bit_length() + 7) // 8, 'big')encrypted_bytes = base36_decode(encrypted_text, alphabet)
decrypted_bytes = bytes(encrypted_bytes[i] ^ key[i % len(key)] for i in range(len(encrypted_bytes)))result_text = ""
for byte in decrypted_bytes:
if 32 <= byte <= 126:
result_text += chr(byte)
else:
breakprint("Исходная строка (base-36):")
print(encrypted_text)
print("\nКлюч XOR (hex):")
print(key_hex)
print("\nРезультат расшифровки:")
print(result_text)Исходная строка (base-36):
2E3GX3C3U93E4JK545I35M69L6Q6N78F91PAF9D0CED0GEAF91GQHZRJ6K95LON1TN4QB2S0TMVVRКлюч XOR (hex):
6ce0acaddfdbbf41a511bfa8f3007a983ade5aРезультат расшифровки:
happy new year 2026
OldMamont
14.12.2025 13:59но это неправильно :(

eimrine
14.12.2025 13:59alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Есть ли надежды что хотя бы эта строчка тут правильна? Ведь мы не знаем ничего ни про что и алфавит может быть любым. Я вижу эту строчку в любой программе по расшифровке base36.

OldMamont
14.12.2025 13:59предположение что алфавит 36 = 26 букв+10цифр, вроде как угадано верно, наличие ключа в общем то это подтверждает...

eimrine
14.12.2025 13:59Суть алфавита в том чтобы прописать каждому символу цифровое значение, например первый элемент алфавита, 0, имеет первый индекс, тоже 0, символ A имеет цифровое значение 11, итд. А может быть, тут алфавит такой что первый символ Q, второй 4 - то есть совсем рандомный, а не стандартный. Подобрать правильный алфавит и может быть выскочит что-то другое осмысленное.

Maxim_Q
14.12.2025 13:59Прошу пояснить откуда взялся этот ключ? Как нам вообще можно было догадаться что нужно использовать для дешифровки именно этот ключ?
key_hex = "6ce0acaddfdbbf41a511bfa8f3007a983ade5a" # как вы его получили?Например когда я расшифровывал у меня другой ключ получился, вот этот: 42f4bfb68682be51f248a3ace052689a38da4d68 подставьте в свой код.
P.S. Я не считаю это решением вообще, ни свое ни ваше.

OldMamont
14.12.2025 13:59походу ваш результат гораздо правильнее и реалистичнее...

temaweb10 Автор
14.12.2025 13:59Решение задачи тут:
https://github.com/OpenSourceDevsHub/Christmas-Contest-2025
lov4ble
Задача интересная, уже присоединился к обсуждению))