![]() |
Всем привет! Этот материал открывает серию разборов задач по криптографии с Google CTF Beginner's Quest. Серия выстроена как своеобразный квест: в каждой последующей задаче приватный ключ «ломается» все больше и больше. В Redacted RSA 1 все довольно просто: нам достается приватный ключ, у которого содержимое слегка искажено. Несмотря на повреждения, ключ все еще содержит не только значения открытого ключа (n и e), но и значение приватной экспоненты (d), то есть все необходимые данные для расшифровки флага. Чтобы было понятнее, в Redacted RSA 2 значение d уже слишком повреждено для прямого использования, и придется поискать обходные пути. Но об этом мы поговорим в другой раз. Сейчас сосредоточимся на первой задаче — самой «щадящей» в серии. Этот разбор можно считать своего рода вводным уроком: он не только объяснит решение конкретной задачи, но и освежит базовые принципы работы RSA, так что новичкам материал будет особенно полезен.
Чтобы уверенно двигаться дальше, разберемся, какие кусочки информации прячутся внутри RSA‑ключа. Для опытных криптографов это азы, но новичкам полезно увидеть все разложенным по полочкам.
Когда в условии задачи мы видим поврежденный приватный ключ, первые шаги могут показаться пугающими. Но на самом деле все довольно просто: ключ все еще можно разобрать стандартными инструментами. Для этого отлично подходит сервис asn1js — это веб‑декодер ASN.1/DER‑структур (а именно в таком формате закодированы большинство RSA‑ключей). Однако, чтобы ключ был корректно прочитан этим сервисом, необходимо выполнить несколько шагов. Что нужно сделать:
Для тех, кто впервые сталкивается с этим сервисом: достаточно выбрать конкретное поле (например, modulus) и нажать опцию «Copy value». Все, у вас есть большое число в десятичном или шестнадцатеричном виде, с которым дальше можно работать. На самом деле RSA работает не с файлами или строками, а с целыми числами (очень большими). Сообщение превращают в число, возводят его в степень и делят по модулю n. Шифрование закончено. Поэтому, когда мы берем данный нам encrypted.txt, внутри это просто набор байтов, который нужно интерпретировать как одно большое число. Но компьютер не умеет угадывать, что мы хотим. Нужен быстрый способ перевести «сырые байты» → «большое десятичное число». На мой взгляд, самый удобный путь — это Python‑однострочник: Python: Код:
# Считываем данные из файлаТеперь зашифрованный текст представлен в нужном формате. Итак, у нас на руках есть все необходимое: модуль n, приватная экспонента d и зашифрованный текст c в числовом виде. Настало время превратить шифртекст в обычный флаг. Самый быстрый путь, особенно если не хочется возиться с библиотеками или вспоминать синтаксис длинных консольных команд, — воспользоваться онлайн‑сервисом RSA Cipher на dCode. Пошагово это выглядит так: 1. Идем на сайт и в поиске находим нужный сервис. 2. Подставляем в соответствующие поля:
Через пару секунд сервис выполнит все вычисления и вернет исходное сообщение — наш флаг в удобочитаемом виде. Для CTF такой способ особенно практичен: ничего не нужно устанавливать, не нужно иметь дело с зависимостями или командной строкой — все решается прямо в браузере. Вбили числа → нажали кнопку → получили флаг → отправили и наслаждаемся победой. Хотел бы добавить, что задачка по-прежнему доступна для решения, и вы все еще можете самостоятельно проделать эти шаги и сдать флаг. |
| Время: 20:56 |