Главная / Блог / Криптография в CTF для начинающих: от распознавания шифра до автоматического взлома

14 мин.00

Криптография в CTF для начинающих: от распознавания шифра до автоматического взлома

Криптография в CTF для начинающих: от распознавания шифра до автоматического взлома

Криптография в CTF для начинающих: от распознавания шифра до автоматического взлома

Строка Gur synt vf cvpbPGS{abg_gbb_onq_bs_n_ceboyrz} — ROT13. Один клик в CyberChef — и ответ: The flag is picoCTF{not_too_bad_of_a_problem}. Тридцать секунд для того, кто узнал паттерн. Часы впустую — для того, кто полез в RSA-калькуляторы.

Crypto-категория в CTF устроена парадоксально: большинство задач начального уровня не требуют высшей математики — только умение распознать, с чем имеешь дело. Самая сложная часть — не взлом шифра, а определение его типа. Звучит банально, пока не просидишь полчаса над hex-строкой, которая оказалась тупо base64 без паддинга.

Дальше — практический гайд по трём базовым элементам криптоанализа: base-кодировки, шифр Цезаря и XOR. От визуальных маркеров до автоматических солверов на Python.

Как устроены crypto CTF задания

В формате Jeopardy — самом распространённом формате CTF-соревнований — задания раскиданы по категориям: Web, PWN, Reverse, Forensics, Crypto и другим. Crypto (криптография) — одна из основных, и задания внутри делятся на несколько уровней:

  • Кодировки (encoding) — base64, base32, hex, ASCII-преобразования. Это не шифрование, а перевод данных из одной формы в другую. Ключа нет — нужно только определить формат.
  • Классические шифры — Цезарь, Виженер, подстановочные шифры, Rail Fence. Алгоритмы давно сломаны, задача — распознать тип и применить правильный подход к взлому.
  • XOR-шифрование — побитовая операция с ключом. Простейший вариант «настоящего» шифрования, но с предсказуемыми слабостями при коротких ключах.
  • Современная криптография — RSA, AES, эллиптические кривые. Тут уже нужна алгебра и теория чисел.

Статья покрывает первые три уровня — всё, что встречается в подавляющем большинстве crypto CTF заданий для начинающих. И навыки эти работают далеко за пределами соревнований: в реальных атаках base64 и XOR используют для обфускации payload'ов. В MITRE ATT&CK это описано как Data Encoding (T1132) для C2-коммуникаций и Obfuscated Files or Information (T1027) для маскировки вредоносных файлов. Те же приёмы, что и в CTF, только ставки выше.

Требования к окружению для практических разделов:

  • Python 3.6+ (для скриптов-солверов)
  • Браузер с доступом к gchq.github.io/CyberChef (установка не требуется)
  • Опционально: pip install xortool для автоматизации анализа многобайтового XOR
  • ОС: любая (Linux, Windows, macOS). В Linux утилиты base64 и base32 доступны из коробки

Распознавание base-кодировок по визуальным маркерам

Первое, с чем сталкивается новичок в crypto CTF — строка непонятных символов. Прежде чем что-то расшифровывать, нужно понять: это шифр или просто кодировка? Разница принципиальная — кодировка обратима без ключа, шифр — нет. Согласно RFC 4648, каждая base-кодировка использует фиксированный алфавит, и по нему тип определяется за секунды.

Кодировка Алфавит Паддинг = Пример
Base16 (hex) 0-9, A-F Нет 48656C6C6F
Base32 A-Z, 2-7 Да, до 6 символов JBSWY3DPEBLW64TMMQ======
Base64 A-Z, a-z, 0-9, +, / Да, 1-2 символа SGVsbG8gV29ybGQ=
Base58 A-Z, a-z, 0-9 без 0OIl Нет 2NEpo7TZRRrLZSi2U
Base85 (ASCII85) Печатные ASCII !-u Обрамление <~ ~> <~87cURD]j~>

Работает если: строка содержит только символы из алфавита соответствующей кодировки. Не работает если: данные дополнительно зашифрованы после кодирования — тогда base64 декодирование даст бинарный мусор, а не читаемый текст.

Три правила быстрой идентификации:

  1. Есть == в конце и строчные буквы — скорее всего base64. Самая частая кодировка и в CTF, и в жизни: JWT-токены, cookie, API-параметры.
  2. Есть = в конце, только заглавные буквы и цифры 2-7 — base32. Встречается реже, но если работали с Google Authenticator — видели TOTP-секреты именно в base32.
  3. Только hex-символы 0-9, A-F, длина кратна двум — base16 (hex). Классика жанра: данные якобы «зашифрованы», а на деле просто закодированы.

Для base58 характерный признак — отсутствие визуально неоднозначных символов 0, O, I, l. Если строка похожа на Bitcoin-адрес — стоит попробовать base58 декодирование.

Вложенные кодировки и CyberChef Magic

Частая ловушка в CTF — вложенные кодировки: base64 внутри base32 внутри hex. Матрёшка. Разматывать вручную — потеря времени. В CyberChef для CTF есть функция Magic (иконка волшебной палочки): она автоматически определяет тип кодировки и предлагает цепочку операций для снятия всех слоёв.

Ручной алгоритм для случаев, когда Magic не справляется:

  1. Определить внешний слой по визуальным маркерам из таблицы выше.
  2. Декодировать один слой.
  3. Посмотреть на результат — если снова каша, вернуться к шагу 1.
  4. Повторять, пока не появится читаемый текст или формат флага.

В терминологии MITRE ATT&CK множественные слои кодирования — стандартная практика обфускации. Техника Deobfuscate/Decode Files or Information (T1140) описывает именно процесс последовательного снятия слоёв при анализе вредоносного ПО. Те же навыки, что для CTF, — при реальном incident response.

Шифр Цезаря: взлом от ручного перебора до автоматизации

Шифр Цезаря — подстановочный шифр, где каждая буква сдвигается на фиксированное число позиций в алфавите. Сдвиг 3: A→D, B→E, C→F. ROT13 — частный случай со сдвигом 13, популярный потому что двойное применение возвращает исходный текст (13+13=26, полный оборот алфавита). По сути — шифр, который расшифровывает сам себя.

Как распознать шифр Цезаря в задании:

  • Текст выглядит «почти как английский» — структура слов на месте (пробелы, длина слов реалистичная), но буквы «не те».
  • Знаки препинания, цифры и пробелы обычно не затронуты.
  • Если в задании виден фрагмент известного формата флага (например, cvpbPGS{ — каждая буква сдвинута от picoCTF{), это стопроцентный маркер Цезаря. Дальше можно не гадать.

Работает если: алфавит стандартный (латиница A-Z), сдвиг единый для всех символов. Не работает если: используется кириллица с нестандартным алфавитом, полиалфавитная подстановка (шифр Виженера), или автор задачи перемешал алфавит произвольно (общий моноалфавитный шифр).

Brute force шифра Цезаря на Python

Всего 25 возможных сдвигов, не считая нулевого. Перебрать все — тривиальная задача:

def caesar_brute(ciphertext):
    for shift in range(1, 26):
        result = ""
        for ch in ciphertext:
            if ch.isalpha():
                base = ord('A') if ch.isupper() else ord('a')
                result += chr((ord(ch) - base - shift) % 26 + base)
            else:
                result += ch
        print(f"Сдвиг {shift:2d}: {result}")

caesar_brute("Gur synt vf cvpbPGS{abg_gbb_onq_bs_n_ceboyrz}")

Скрипт выведет 25 строк. Нужный вариант — тот, где текст читается. При сдвиге 13 получаем: The flag is picoCTF{not_too_bad_of_a_problem}. Для CTF хватает глаз — 25 строк просматриваются за секунды. В CyberChef тот же результат даёт операция ROT13 или Caesar Cipher Decode с перебором значения key.

Нюанс, на котором спотыкаются: если после ROT13 текст всё ещё нечитаем, но знаки препинания выглядят странно — пробуйте ROT47. Он сдвигает весь диапазон печатных ASCII от ! до ~, захватывая цифры и спецсимволы.

Частотный анализ шифров для длинных текстов

Для коротких строк brute force эффективнее — 25 вариантов просматриваются мгновенно. Но если шифротекст — целый абзац или страница, частотный анализ позволяет определить сдвиг без перебора.

Принцип: в английском тексте самая частая буква — E (примерно 12.7% появлений), затем T (около 9.1%), A (около 8.2%). Если в шифротексте самая частая буква — R, то вероятный сдвиг = позиция R минус позиция E = 13. Проверяете гипотезу дешифровкой — и в подавляющем большинстве случаев она подтверждается.

Принцип работает для любого моноалфавитного подстановочного шифра, не только для Цезаря. На dCode (dcode.fr) частотный анализ шифров выполняется автоматически — сервис показывает распределение букв в виде гистограммы. Для русскоязычных текстов самая частая буква — О, за ней Е и А.

XOR шифр: расшифровка от одного байта до многобайтового ключа

XOR (eXclusive OR) — побитовая операция, фундамент простейшего шифрования. Каждый бит данных XOR'ится с соответствующим битом ключа. Главное свойство: A XOR K XOR K = A — двойное применение одного ключа возвращает исходные данные. Одна и та же операция шифрует и расшифровывает. Красиво и просто — поэтому XOR так любят авторы малвари.

В реальных атаках XOR используют повсеместно. MITRE ATT&CK техника Obfuscated Files or Information (T1027) включает XOR-обфускацию как один из самых распространённых методов маскировки payload'ов. Навык расшифровки XOR — прямая подготовка к работе с реальными инцидентами.

Как распознать XOR-шифрование в задании:

  • Результат — бинарные данные, часто представленные в hex-формате.
  • Если ключ короткий (1-4 байта), в hex-представлении видны повторяющиеся паттерны с периодом, равным длине ключа.
  • При однобайтовом XOR с ASCII-текстом нулевые байты (\x00) появляются в позициях, где символ открытого текста совпал с ключом.

Работает если: ключ — один байт (256 вариантов) или короткий многобайтовый ключ до 32 байт. Не работает если: ключ равен длине данных (one-time pad — математически невзламываемый) или данные были сжаты перед XOR-шифрованием.

Подбор однобайтового XOR ключа

Однобайтовый XOR — самый частый вариант в crypto CTF заданиях для начинающих. Ключ — одно число от 0 до 255. Перебираем все варианты и фильтруем по читаемости:

def xor_single_byte_brute(data_hex):
    data = bytes.fromhex(data_hex)
    for key in range(256):
        result = bytes([b ^ key for b in data])
        if all(32 <= b < 127 for b in result):
            print(f"Key 0x{key:02x}: {result.decode('ascii')}")

# пример для демонстрации концепции
xor_single_byte_brute("4f626b6b68275078756b63")

Скрипт фильтрует результаты по критерию «все байты — печатные ASCII». Для коротких строк может подойти несколько ключей, но нужный — тот, где текст осмысленный. Для повышения точности добавляют подсчёт частоты пробелов и букв e, t, a — чем больше «английских» паттернов, тем вероятнее правильный ключ.

В CyberChef аналогичный результат даёт операция XOR Brute Force — выводит все 256 вариантов с подсветкой наиболее вероятных.

Многобайтовый XOR и атака известным открытым текстом

Если ключ длиннее одного байта, прямой перебор дорожает экспоненциально: для двухбайтового — 65 536 вариантов, для четырёхбайтового — свыше 4 миллиардов. Но в CTF есть козырь — известный открытый текст.

Формат флага обычно объявляется заранее: picoCTF{, flag{, HTB{. Если шифротекст содержит зашифрованный флаг, достаточно XOR'ить начало шифротекста с известным началом — результат даст ключ или его фрагмент. Принцип: если ciphertext = plaintext XOR key, то key = ciphertext XOR plaintext.

# известное начало флага "flag{"
cipher_start = bytes.fromhex("0b150a0202")
known_plaintext = b"flag{"
key = bytes([c ^ p for c, p in zip(cipher_start, known_plaintext)])
print(f"Ключ: {key}")  # выведет b'mykey'

Получив фрагмент ключа, определяем его длину. Если ключ применяется циклически (а это стандартная схема repeating-key XOR), паттерн повторится через каждые N байт. Восстановив полный ключ, расшифровываем весь текст.

Для автоматизации есть утилита xortool. Установка: pip install xortool. Запуск: xortool -l <длина_ключа> -c 20 файл — параметр -c 20 указывает, что наиболее частый символ открытого текста — пробел (0x20, что верно для английского текста). Утилита сама вычисляет вероятную длину ключа по индексу совпадений и подбирает значение.

Инструменты для crypto CTF: CyberChef и не только

CyberChef (gchq.github.io/CyberChef) — первый инструмент, который стоит открыть на любом crypto-задании. Разработан GCHQ (британская спецслужба), работает в браузере без установки. Для задач начального и среднего уровня его хватает за глаза.

Операции, которые нужны чаще всего:

  • From Base64 / From Base32 / From Hex — декодирование кодировок в один клик.
  • Magic — автоматическое распознавание вложенных кодировок и снятие всех слоёв.
  • ROT13 / Caesar Cipher Decode — взлом шифра Цезаря перебором сдвигов.
  • XOR / XOR Brute Force — применение XOR с заданным ключом или перебор однобайтовых ключей.

Сила CyberChef — в цепочках операций (recipes). Пример: From HexXOR (ключ 0x42) → From Base64 — три слоя обфускации снимаются за одну загрузку. Рецепты можно сохранять и делиться ссылками с командой.

Инструмент Назначение Когда использовать
CyberChef Универсальный декодер и шифровальщик Первый инструмент для любого задания
dCode (dcode.fr) Идентификация и автоматический взлом шифров Если тип шифра неизвестен — Cipher Identifier попробует определить
xortool Анализ многобайтового XOR Когда ключ длиннее 1 байта и brute force нереален
CryptoPals Набор обучающих заданий по криптографии Для системного изучения после освоения базовых CTF-задач
CryptoHack Интерактивные криптографические задачи Для перехода от классических шифров к RSA и AES
Practical Cryptography Справочник по шифрам и кодам Для опознания неизвестного шифра по характеристикам

На dCode особенно полезна функция Cipher Identifier — вставляете шифротекст, сервис предлагает возможные типы шифров с оценкой вероятности. Экономит время, когда визуального распознавания недостаточно и глазами не получается.

Автоматический взлом шифров: пошаговая методология

Для решения crypto CTF заданий нужна не интуиция, а методичный алгоритм. Вот схема, которая работает для задач начального и среднего уровня:

Шаг 1. Определить тип данных. Смотрим на алфавит строки. Только hex-символы? Есть == в конце? Только заглавные буквы плюс цифры 2-7? Сверяемся с таблицей визуальных маркеров base-кодировок. Бинарные данные — скорее всего XOR или блочный шифр.

Шаг 2. Проверить кодировки. Пробуем From Base64, From Hex, From Base32 в CyberChef. Если результат — читаемый текст или другая кодировка, это не шифр. Разматываем слои до конца. Magic делает это автоматически.

Шаг 3. Проверить классические шифры. Если текст «почти читается» — вероятно подстановочный шифр. Brute force шифра Цезаря (25 сдвигов) — первое, что стоит попробовать. Не помогло — Виженер (подсказка ключа часто есть в условии задачи). Для неопознанных шифров — dCode Cipher Identifier.

Шаг 4. Проверить XOR. Бинарные данные без паттернов кодировок — XOR Brute Force в CyberChef для однобайтового ключа. Для многобайтового — атака известным открытым текстом через формат флага.

Шаг 5. Проверить формат флага. После каждого шага искать формат флага в результате: flag{, picoCTF{, HTB{, ctf{. Поиск по подстроке — быстрее, чем вычитывать глазами.

Шаг 6. Вложенные слои. Если после одного раунда декодирования получилась новая каша — возвращаемся к шагу 1. Вложенные кодировки — стандартный приём авторов CTF-задач.

Типичные ловушки для начинающих

Паттерны, на которых стабильно теряют время новички:

Hex без префикса 0x. Строка 48656c6c6f — не шифр, а hex-кодированное Hello. Видите только символы 0-9 и a-f с чётной длиной строки — первым делом From Hex.

Base64 без паддинга. Некоторые реализации убирают = из конца base64-строки. Если строка содержит верхний и нижний регистр плюс цифры, но без = — это всё ещё может быть base64. CyberChef декодирует и без паддинга.

Двойной base64. Результат первого декодирования base64 снова выглядит как base64 — заглавные, строчные, цифры, =. Применяйте From Base64 повторно, пока не получите читаемый текст или бинарные данные. Не ленитесь — авторы задач тоже не ленились, когда заворачивали.

ROT47 вместо ROT13. ROT13 работает только с буквами. ROT47 сдвигает весь диапазон печатных ASCII от ! до ~ — цифры и спецсимволы тоже меняются. Если после ROT13 текст нечитаем и знаки препинания выглядят странно — ROT47 в CyberChef.

ASCII-коды вместо текста. Строка 72 101 108 108 111 — десятичные ASCII-коды букв Hello. Бывают варианты в восьмеричной (110 145 154 154 157) или двоичной системе (01001000 01100101 01101100 01101100 01101111). CyberChef операция From Decimal / From Octal / From Binary решает задачу мгновенно.

Ни одна из этих ловушек не требует глубоких знаний криптографии. Нужна только методичность и набитый глаз на визуальные паттерны. Именно поэтому решение crypto-задач начального уровня — идеальная точка входа в криптоанализ: барьер входа минимальный, а навык распознавания паттернов универсален.

Я наблюдал это не раз: участники, которые выучили математику RSA и могут объяснить протокол Диффи-Хеллмана на доске, проваливаются на задачах уровня base64-в-base32-в-hex. Проблема не в интеллекте — распознавание паттернов и знание теории живут в разных навыковых плоскостях. Паттерн-матчинг тренируется только решением десятков задач подряд, ни одна книга этого не даёт.

Рискну дать прогноз: в ближайшие год-два crypto-задачи начального уровня на CTF усложнятся не по математике, а по количеству вложенных слоёв и нестандартных кодировок. CyberChef Magic уже справляется с простыми случаями, и авторы задач вынуждены использовать кастомные алфавиты и комбинации XOR с многослойным кодированием, которые автоматика не берёт. Единственный способ не застрять — писать свои солверы хотя бы на уровне десятистрочного скрипта.

Самое ценное, что дают crypto-задачи, — привычка декомпозировать проблему. Видишь base64-строку в cookie — декодируешь — внутри JSON с ещё одним слоем кодирования. Тот же навык нужен при анализе JWT-токенов в реальном веб-приложении или реверсе обфусцированного payload'а. Если хочешь не только разбирать writeups, а выстроить навык с прогрессией от задачи к задаче — на WAPT это реализовано через лабы с ментором в чате.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...