Урок 1. Как читать криптографическую задачу
Давайте честно договоримся с самого начала, потому что от этого зависит всё дальнейшее. Криптографическая задача на олимпиаде по информационной безопасности — это почти никогда не «угадай, каким шифром это зашифровано». Гораздо чаще это выглядит так: вам дают файл или строку, внутри которых спрятан флаг вида vsosh{...}, и ваша работа — понять, в каком виде лежат данные, и аккуратно вернуть их в читаемый вид.
Разница огромная. Если вы будете подходить к задаче как к загадке «что за шифр», вы застрянете: шифров тысячи, и перебирать их наугад бессмысленно. Если же вы подходите как криптоаналитик, то первый вопрос у вас другой: «в каком представлении сейчас находятся данные и что нужно сделать, чтобы увидеть их нормально?». Этот сдвиг во взгляде — и есть главный навык всего курса.
Что обычно дают в задачах
Формулировки бывают разные, но по сути вам почти всегда дают что-то из этого:
- строку, которая выглядит странно:
dnNvc2h7...,KRUGS4ZANF...,76 73 6f 73 68 7b...; - файл (
.txt,.bin, дамп, лог), внутри которого спрятаны данные; - сервис, к которому нужно подключиться и что-то у него «выпросить» (это будет позже в курсе).
И почти всегда есть флаг — короткая строка, которую надо сдать в систему. На наших олимпиадах и в этом курсе флаг имеет фиксированный формат:
vsosh{...}
Запомните этот формат прямо сейчас, потому что он — ваш лучший друг. Флаг всегда начинается с vsosh{ и заканчивается }. Это значит, что даже не решив задачу до конца, вы часто знаете первые шесть символов ответа. Дальше в курсе вы увидите, что этих шести известных символов иногда достаточно, чтобы полностью восстановить ключ шифра. Пока просто зафиксируйте: vsosh{ — не украшение, а зацепка.
Почему «странная строка» — это не всегда шифр
Вот первое, что нужно перестать делать: пугаться странных строк. Большинство «нечитаемых» строк в задачах — это вообще не шифрование, а кодировка, то есть просто другой способ записать те же самые байты.
Разберём разницу на пальцах.
- Шифрование — это преобразование, для обращения которого нужен секрет (ключ). Без ключа расшифровать нельзя (в идеале).
- Кодировка — это открытое, обратимое представление данных, без всякого секрета. Например, hex или base64: любой может закодировать и раскодировать, ключ не нужен.
Когда вы видите dnNvc2h7ZmxhZ30=, это не «взломанный шифр» — это обычный текст, записанный в base64. Раскодировать его может кто угодно за одну строчку Python. Значительная часть «крипто»-задач начального уровня — именно такие: снаружи страшно, внутри — просто кодировка (иногда в несколько слоёв), а настоящий шифр (если он есть) прячется глубже. Ровно так была устроена задача «Полимерный контейнер» · школьный этап, 2025–2026: пугающая строка оказывалась кодировкой, которую надо было аккуратно снять.
Поэтому главный вопрос в начале задачи — не «какой это шифр», а: «это уже шифр или пока просто кодировка?»
Цикл решения
У опытного решателя в голове работает один и тот же короткий цикл. Выучите его — он не изменится до конца курса, поменяются только детали внутри шагов.
- Посмотреть на данные. Что перед вами: текст, набор байтов, числа, файл, сервис?
- Определить представление. На что похожа строка — на hex? base64? base32? список чисел? Просто на бинарные байты?
- Снять слои. Раскодировать то, что раскодируется. После каждого шага снова посмотреть: а на что теперь похоже? (Часто задача устроена как несколько слоёв.)
- Написать короткий решатель. Обычно это 10–20 строк Python: прочитать вход, преобразовать, напечатать результат.
- Проверить флаг. Получилось
vsosh{...}? Отлично. Получилась опять каша? Значит, слой ещё не тот — возвращаемся к шагу 2.
Обратите внимание на шаг 3: если после декодирования снова получилась странная строка — это не ошибка и не тупик. Часто именно так задача и задумана: base64 внутри base64, или base64, который раскрывается в base32, и так далее. Каждый снятый слой приближает вас к ответу.
Первые признаки: как отличать представления на глаз
Чтобы уверенно проходить шаг 2, нужно научиться быстро узнавать три-четыре самых частых представления. Полностью мы разберём их в уроке 2 и напишем код, а сейчас — «портреты», чтобы вы начали их узнавать.
Hex (шестнадцатеричное). Только символы 0–9 и a–f (иногда заглавные A–F). Длина чётная (каждый байт — ровно два символа). Часто разделён пробелами по два символа.
76 73 6f 73 68 7b 68 65 6c 6c 6f 7d
Если вы видите строку, где встречаются только цифры и буквы до f — это почти наверняка hex.
Base64. Алфавит широкий: большие и маленькие буквы, цифры, а также символы + и /. В конце часто стоят один или два знака = (это паддинг — добивка до нужной длины). Строка «похожа на текст, но с перемешанным регистром».
dnNvc2h7aGVsbG99
Ключевая примета: если в строке есть и заглавные, и строчные буквы вперемешку (а иногда +, /, =) — думайте про base64.
Base32. Только заглавные буквы A–Z и цифры 2–7 (никаких 0, 1, 8, 9). Паддинг = тоже бывает. Выглядит «кричаще»: сплошные капсы и немного цифр.
O5SWYZDFOJSXG5BAMFXG64Q=
Примета: всё в верхнем регистре, цифры только 2–7 — это base32.
Числа (десятичные байты). Иногда данные вообще записаны как список чисел от 0 до 255 через пробел или запятую. Каждое число — это значение одного байта.
118 115 111 115 104 123
Примета: строка из небольших целых чисел через разделитель — это байты, записанные «в лоб».
Не переживайте, если сейчас границы кажутся размытыми (например, строка из одних заглавных без цифр может быть и base32, и чем-то ещё). В уроке 2 мы сделаем эти признаки точными и превратим их в проверяемое правило. Пока достаточно, чтобы вы начали задавать себе правильный вопрос: «на что это похоже по алфавиту?».
Мини-примеры
Посмотрите на три строки и, не пытаясь их раскодировать, просто определите представление:
53 56 4f 53 48→ только0–9a–f, через пробел, чётные пары → hex.dnNvc2g=→ смешанный регистр, на конце=→ base64.PB2GQ2LM→ сплошь заглавные и цифры из диапазона 2–7 → base32.
Видите? Мы ещё ничего не «взломали», но уже знаем, с чего начинать каждую из них. Это и есть шаг 2 цикла. Всё остальное — дело техники, которую вы освоите в следующих уроках.
Практика урока
Пришло время самому. В этом уроке практика — на распознавание, без написания кода: важно натренировать глаз, прежде чем браться за инструменты.
- Разминочные вопросы (Q1, Q2) — проверяют, поняли ли вы главную идею урока: с чего начинать задачу и почему странная строка не всегда шифр.
- Задача C1 «Опознать представление». В файле лежит одна строка. Ваш ответ — одно слово:
hex,base64илиbase32. Никакого кода не требуется, только внимательный взгляд на алфавит.
Порог прохождения урока — половина баллов (10 из 20). То есть достаточно уверенно ответить на вопросы и решить задачу распознавания; выбивать «всё идеально» не нужно.
Типичная ошибка
Самая частая ошибка новичка на этом этапе — сразу лезть «расшифровывать», не поняв представление. Человек видит dnNvc2h7..., решает, что это «какой-то шифр», и начинает гадать про Цезаря, про сдвиги, про частотный анализ — а это просто base64, который раскрывается одной строчкой. Не гадайте шифр. Сначала спросите: «в каком виде записаны данные?».
Что дальше
Мы научились узнавать представления. Но чтобы их снимать, нужно перестать видеть в данных «строку» и начать видеть байты — и уметь свободно переходить между байтами, hex и текстом. Ровно с этого начинается урок 2, и там же вы напишете первый решатель и сдадите первый настоящий флаг.
Опознать представление
В файле — одна строка. Определи её представление. Ответ — одно слово: hex, base64 или base32.