
На последнем picoCTF новичок из моей команды просидел 40 минут над строкой Q1RGe3czb...fQ==, пытаясь подставить её как флаг. Потом полез искать «дешифровщик непонятных символов». Строка была обычным Base64 — одна команда в терминале, пять секунд. Опытный игрок опознал кодировку по двум символам == в конце, даже не вчитываясь. Крипто-категория на CTF пугает больше остальных, но на начальном уровне 90% тасков решаются не математикой, а распознаванием паттернов. Это практический разбор трёх техник, которые закрывают абсолютное большинство crypto тасков CTF начального уровня: Base64-декодирование, взлом шифра Цезаря и подбор XOR-ключа. С кодом на Python, примерами и пошаговым алгоритмом.
Прежде чем ломать что-либо, нужно чётко разделить два понятия. Путаница между кодированием и шифрованием — причина потерянных часов на каждом втором CTF. Подробнее — в нашем руководстве по создание ctf заданий.
Кодирование — преобразование данных из одного формата в другой. Секрета здесь нет. Base64, hex, URL-encoding — способы представления одних и тех же данных разными символами. Любой декодирует обратно, зная алгоритм. В реальных атаках кодирование используется не для защиты, а для транспорта: по MITRE ATT&CK, техника Standard Encoding (T1132.001, Command and Control) описывает, как малварь кодирует C2-трафик в Base64, чтобы данные не ломались при передаче через текстовые протоколы и не привлекали внимание примитивных фильтров.
Шифрование — преобразование с использованием ключа. Без ключа или без знания слабости алгоритма восстановить исходный текст нельзя. Шифр Цезаря — подстановочный шифр с ключом-сдвигом от 1 до 25. XOR — побитовая операция с ключом произвольной длины.
На CTF эта разница критическая: закодированное — декодируете, зашифрованное — ломаете. Первые 10 секунд решения любого крипто-таска уходят на определение, что перед вами. Видите знакомый алфавит Base64 с padding? Декодируйте. Видите текст, похожий на английский, но буквы «не те»? Подстановочный шифр. Хаотичный набор байтов в hex? Вероятно, XOR.
Тот же принцип работает в обратную сторону: техника Obfuscated Files or Information (T1027) и подтехника Encrypted/Encoded File (T1027.013) описывают, как вредоносное ПО использует многослойное кодирование и шифрование для обхода антивирусов. На CTF это превращается в задания с вложенными кодировками — Base64 поверх hex поверх ROT13. Такая матрёшка. Умение определить кодировку строки — первый и главный навык для любого крипто-таска.
Base64 — самый частый элемент крипто-тасков начального уровня. Строго говоря, это не криптография вовсе, а кодировка, но авторы CTF регулярно пихают Base64 в категорию crypto. Задача — либо просто декодировать строку, либо распутать цепочку из нескольких вложенных слоёв кодирования.
Научиться распознаванию типа шифра (и кодировки) за секунду — ключевой навык. Вот таблица визуальных отличий трёх самых частых кодировок:
| Признак | Base64 | Base32 | Hex (Base16) |
|---|---|---|---|
| Регистр букв | Mixed (A-Z, a-z) | Только верхний (A-Z) | A-F (любой регистр) |
| Цифры | 0-9 | 2-7 | 0-9 |
| Спецсимволы | +, / |
Нет | Нет |
| Padding | = или == |
До 6 = |
Отсутствует |
| Длина | Кратна 4 | Кратна 8 | Чётная |
Строка Q1RGe3czbGMwbTNfdDBfY3J5cHQwfQ== — mixed case, цифры, два = в конце. Base64. Строка 4A4F4B45 — только символы 0-9A-F, без padding. Hex. Строка JBSXSIJAKRUGS4ZA...4=== — только верхний регистр с цифрами 2-7 и тройной padding. Base32.
Запомните эту таблицу — и вопрос «как определить кодировку строки» перестанет возникать. Для начала этого хватит за глаза.
Три способа — от быстрого к универсальному.
Командная строка Linux — самый быстрый путь на CTF. Команда echo 'Q1RGe3czbGMwbTNfdDBfY3J5cHQwfQ==' | base64 -d мгновенно выдаёт CTF{w3lc0m3_t0_crypt0}. На турнире, когда каждая секунда на счету, быстрее ничего нет.
Python — одна строка в REPL: import base64; print(base64.b64decode('Q1RGe3czbGMwbTNfdDBfY3J5cHQwfQ==').decode()). Результат тот же. Полезно, когда нужно встроить декодирование в скрипт.
CyberChef для CTF — визуальный конструктор преобразований от GCHQ. Вставляете строку в Input, перетаскиваете блок «From Base64» в Recipe, результат в Output. Для Base64 декодирования онлайн CyberChef — самый удобный вариант: сразу показывает результат и позволяет наращивать цепочку без переключения между инструментами.
Авторы тасков обожают вкладывать кодировки друг в друга. Результат Base64-декодирования — снова Base64. Или Base64 поверх hex. Или URL-encoded Base64. На CryptoHack и picoCTF попадаются задания с 3-5 слоями вложенности.
Алгоритм распутывания:
В CyberChef это делается наращиванием блоков в Recipe. Пять слоёв Base64? Пять блоков «From Base64» друг за другом. Base64 → hex → Base64? Три блока в правильном порядке. CyberChef тут выигрывает у командной строки — визуальная цепочка нагляднее, чем конвейер из пяти pipe-команд.
Вложенные кодировки отсылают к реальным сценариям: техника Deobfuscate/Decode Files or Information (T1140) в MITRE ATT&CK описывает, как аналитик или автоматизированный инструмент снимает слои кодирования с вредоносного файла. На CTF вы делаете то же самое, только в роли криптоаналитика.
Шифр Цезаря — классический подстановочный шифр, где каждая буква алфавита сдвигается на фиксированное число позиций. Ключ — число сдвига от 1 до 25 (сдвиг 0 даёт исходный текст, сдвиг 26 — тоже). Один из простых шифров для новичков и одновременно — первый настоящий шифр, который вы сломаете в CTF.
Пространство ключей — 25 вариантов. По аналогии с MITRE ATT&CK — буквально Reduce Key Space (T1600.001). Ключевое пространство настолько мало, что полный перебор укладывается в миллисекунды.
Зашифрованная строка FWI{u0w_wku33} при известном формате флага CTF{...} подсказывает сдвиг за три секунды: C→F = +3. Проверяем: T→W (+3), F→I (+3) — совпадает. Сдвиг 3.
Признаки шифра Цезаря в тексте:
CTF{), сдвиг вычисляется по первым буквамКлючевое отличие от Base64: шифр Цезаря сохраняет структуру текста, а Base64 превращает всё в однородную строку без пробелов. Это главный визуальный маркер для распознавания типа шифра.
Взлом шифра Цезаря — перебор 25 вариантов. Вручную это делать бессмысленно, когда скрипт справится за мгновение:
ct = "FWI{u0w_wku33}"
for shift in range(26):
pt = ""
for c in ct:
if c.isalpha():
base = ord('A') if c.isupper() else ord('a')
pt += chr((ord(c) - base - shift) % 26 + base)
else:
pt += c
print(f"ROT-{shift:2d}: {pt}")
Вывод — 26 строк. При ROT-3 получаем: FWI{u0w_wku33} → CTF{r0t_thr33} — флаг найден. Проверяем: F минус 3 = C, W минус 3 = T, I минус 3 = F. В нижнем регистре: u→r, w→t, w→t, k→h, u→r. Читается: r0t_thr33 (ROT three). Готово.
Альтернативы для тех, кто не хочет писать код: dCode.fr автоматически определяет шифр Цезаря и показывает все 26 вариантов, CyberChef имеет блок «ROT13 Brute Force», который выводит все сдвиги разом. Для быстрого crypto тасков CTF решения на турнире эти инструменты экономят время.
На CTF шифр Цезаря обычно применяется к коротким строкам, и брутфорс работает быстрее любого анализа. Но если зашифрован длинный текст без известного формата флага, помогает частотный анализ: в английском тексте самая частая буква — e (~12.7%), затем t (~9.1%), a (~8.2%). Находите самую частую букву в шифротексте, предполагаете, что она соответствует e, вычисляете сдвиг. Для русскоязычных тасков: самая частая буква — о (~10.97%), затем е (~8.45%), а (~8.01%).
Частотный анализ шифра Цезаря — основа криптоанализа всех подстановочных шифров. В CTF его применяют реже брутфорса (25 вариантов — ничто для компьютера), но понимание принципа критически важно для более сложных шифров: Vigenère, произвольная подстановка, полиалфавитные шифры.
Отдельно стоит упомянуть ROT13 — шифр Цезаря со сдвигом ровно 13. Его фишка: ROT13 — инволюция, применение дважды возвращает исходный текст. В Linux: echo 'текст' | tr 'A-Za-z' 'N-ZA-Mn-za-m'. ROT13 встречается на CTF настолько часто, что для него есть отдельный блок в CyberChef и встроенные команды во многих текстовых редакторах.
XOR (исключающее ИЛИ) — побитовая операция, которая в крипто-тасках CTF используется повсеместно. Главное свойство: A ⊕ K = C и C ⊕ K = A — одна и та же операция шифрует и дешифрует. Красиво, правда? XOR шифрование CTF — вторая по частоте категория задач после кодировок на начальном уровне.
XOR-шифрованные данные выглядят как случайный набор байтов. Но визуальные маркеры есть:
Если ключ — один байт, все нулевые байты исходного текста превращаются в один и тот же байт (сам ключ). Один и тот же байт повторяется подозрительно часто в hex-дампе — это подсказка.
При повторяющемся ключе паттерны повторяются с периодом, равным длине ключа. Hex-дамп визуально менее «случайный», чем настоящий рандом. На достаточно длинном hex-дампе можно заметить ритмичность — глаз привыкает после пары десятков тасков.
Самый быстрый путь — known plaintext. Если вы знаете часть исходного текста (формат флага CTF{, заголовок файла PK для ZIP, %PDF для PDF, \x89PNG для PNG), XOR этого фрагмента с соответствующей частью шифротекста даёт кусок ключа. Когда файл имеет стандартный заголовок, это работает безотказно.
Если ключ — один байт, пространство ключей — 256 вариантов. Перебрать все и оценить результат по частоте «нормальных» ASCII-символов — задача на шесть строк Python. Подсчёт частотных символов (etaoinshrdlu для английского) автоматически выявляет правильный ключ:
ct = bytes.fromhex("1b37373331363f78151b7f2b783431333d")
for k in range(256):
pt = bytes(c ^ k for c in ct)
score = sum(c in b' etaoinshrdlu' for c in pt.lower())
if score > len(ct) // 3:
print(f"Key 0x{k:02x}: {pt}")
Скрипт выводит только те варианты, где больше трети символов — частотные буквы английского языка. Правильный ключ обычно даёт score, кратно превышающий все остальные. Hex ASCII конвертация здесь происходит автоматически через bytes.fromhex().
Если ключ длиннее одного байта, XOR всё ещё ломается, но нужен другой подход. Основы криптоанализа repeating-key XOR сводятся к трём шагам:
Шаг 1 — определение длины ключа. Метод Хэмминга: разбиваете шифротекст на блоки разной длины (2, 3, 4... байт), вычисляете расстояние Хэмминга между первыми двумя блоками и нормализуете на длину блока. Наименьшее нормализованное расстояние указывает на вероятную длину ключа. Этот метод — классика Cryptopals (set 1, challenge 6).
Шаг 2 — разбиение на «полосы». Когда длина ключа известна (допустим, 4 байта), берёте каждый 4-й байт шифротекста — получается текст, зашифрованный одним байтом. Применяете брутфорс однобайтового XOR к каждой «полосе» отдельно.
Шаг 3 — сборка ключа. Объединяете найденные байты каждой полосы — получаете полный ключ. Дешифруете весь текст.
В CyberChef для коротких ключей есть блок «XOR Brute Force». Для ключей длиннее 2-3 байт придётся писать скрипт или использовать готовые решения из CryptoPals.
Набор инструментов для крипто CTF решения начального уровня компактен. Вот что реально используется на каждом турнире:
| Инструмент | Для чего | Когда хватать |
|---|---|---|
| CyberChef | Цепочки кодировок, Base64, ROT, XOR | Первым делом на любом таске |
| dCode.fr | Автоопределение шифра, брутфорс Цезаря, Vigenère | Когда не знаете тип шифра |
| Python | Кастомный брутфорс, hex-парсинг, автоматизация | Когда готовые инструменты не тянут |
| CryptoHack | Обучение и практика крипто-тасков | Между CTF — тренировка насмотренности |
| CLI Linux | base64 -d, xxd, tr, od |
Быстрые одноразовые операции на турнире |
CyberChef для CTF — основной инструмент. Его блок «Magic» пытается автоматически определить тип кодировки и применить декодирование. На простых тасках экономит время, хотя на сложных цепочках лучше собирать Recipe вручную — Magic иногда промахивается, и тогда вы теряете время, доверяя автоматике.
dCode.fr — второй по полезности. Загрузите зашифрованный текст, и сайт предложит варианты: Цезарь, Vigenère, подстановка, транспозиция. Для быстрого распознавания типа шифра — незаменим.
Python — для задач, где нужна кастомная автоматизация. Однобайтовый XOR-брутфорс, repeating-key анализ, парсинг hex-дампов — три-десять строк кода. Библиотеки base64, binascii, itertools покрывают 90% потребностей начального уровня.
Формула на бумаге понятна, но распознавание по-настоящему закрепляется только когда сам прогоняешь десятки строк через эти инструменты. Готовый стенд с крипто-тасками разного уровня есть на HackerLab.pro — российская CTF-платформа с категорией «Криптография», где можно отработать и Base64, и подстановочные шифры без ограничений по времени.
Всё вышесказанное сводится в пошаговый алгоритм для решения любого крипто-таска начального уровня:
Шаг 1 — визуальная оценка (5 секунд). Смотрите на алфавит и структуру строки:
| Что видите | Вероятный тип |
|---|---|
Mixed case + цифры + = padding |
Base64 |
| Только 0-9 и A-F | Hex (Base16) |
| Верхний регистр + цифры 2-7 + padding | Base32 |
Точки и тире через / |
Азбука Морзе |
| Читаемая структура, но буквы «сдвинуты» | Шифр Цезаря (подстановка) |
| Случайные байты, нечитаемый hex-дамп | XOR или более сложный шифр |
| Числа через дефис (14-15-2-15) | Letter Numbers (A=1) |
Шаг 2 — проверка гипотезы (10 секунд). Пробуете декодировать в CyberChef или dCode. Если результат — читаемый текст или другая кодировка — двигаетесь дальше по цепочке.
Шаг 3 — применение конкретного инструмента. Base64 → base64 -d. Цезарь → брутфорс 25 сдвигов. XOR → брутфорс ключа. Неизвестный шифр → CyberChef Magic или dCode автоопределение.
Шаг 4 — проверка формата флага. Результат должен содержать формат флага платформы (CTF{...}, flag{...}, picoCTF{...}). Если формат найден — сдаёте. Если нет — возможно, нужен ещё один слой декодирования. Возвращаетесь к шагу 1.
Этот алгоритм закрывает подавляющее большинство крипто-тасков начального уровня на CTF-платформах. За его границами — RSA, AES, Vigenère и кастомная криптография, которые требуют отдельного разбора и более серьёзного математического аппарата (модульная арифметика, теория чисел, SageMath).
Крипто-категория на CTF — одна из самых недооценённых по отдаче на вложенное время. На среднем jeopardy-CTF таски базового уровня решают большинство участников, а промежуточные — меньше пятой части. Скачок происходит ровно на границе «кодировки и классические шифры» против «RSA, AES, кастомная криптография». Три техники из этой статьи — Base64, Цезарь, XOR — полностью закрывают нижнюю ступень. Дальше начинается территория, где без модульной арифметики и SageMath не обойтись.
По опыту решения нескольких сотен крипто-тасков: навык мгновенного распознавания типа шифра по визуальным маркерам напрямую переносится на реальные задачи. На пентестах попадаются Base64-токены в cookies, XOR-обфусцированные конфиги C2-фреймворков, ROT13-скрытые строки в исходниках legacy-приложений. Принцип тот же — опознал паттерн, применил инструмент, получил читаемый текст. Только вместо очков — находки в отчёте.
Частая ошибка — пропускать крипто на CTF, потому что «нужна высшая математика». На начальном уровне нужна не математика, а насмотренность. Пять решённых тасков на CryptoHack — и Base64 с Цезарем больше не вызывают паузы. Десять — и однобайтовый XOR читается на автомате. Двадцать — и вы начинаете видеть паттерны в hex-дампах, которые раньше казались шумом. Потренировавшись «на кошках», можно смело двигаться дальше. Если хочешь не один writeup, а 30 уровней прогрессии до OSCP-стандарта — на WAPT эту цепочку проходят с лабой на каждый кейс.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...