#googlectf #writeup #crypto
Redacted RSA 1 от @Max_RSC
Всем привет! Я планирую написать серию разборов задач по криптографии от Google CTF. Вкратце, суть заключается в том, что в каждой последующей задачке приватный ключ становится все более поврежденным. В Redacted RSA 1 нам предоставляется значение d, тогда как в Redacted RSA 2 извлечь d становится невозможно из-за сильного повреждения ключа. Тем не менее, значение d все еще можно рассчитать. Но давайте вернемся к первой, самой простой задачке этой серии.
В первом случае у нас есть часть приватного ключа, которая содержит не только значения открытого ключа (n и e), но и значение приватной экспоненты (d), то есть все необходимые данные для расшифровки. Основная сложность, с которой сталкиваются новички, заключается в том, что они не знают, как извлечь эти значения. Простым и доступным способом решения этой проблемы является использование онлайн-сервиса, такого как:
https://lapo.it/asn1js
Однако, чтобы ключ был правильно прочитан этим сервисом, необходимо выполнить несколько шагов. Во-первых, откройте приватный ключ в любом текстовом редакторе и замените все звездочки (*) на символы, допустимые в base64 (например, на «A»). После этого файл можно загрузить на сервис, который корректно интерпретирует данные. Если при попытке загрузить ключ на сервис возникла ошибка с сообщением наподобие "Error: Content size is not correct for container at offset 6", это означает, что вы что-то сделали не так.
В результате, загрузив наш поврежденный приватный ключ на сервис, мы увидели, что он все еще достаточно целостен, чтобы расшифровать шифртекст: значения n и d сохранились в полном объеме!
Я сделаю небольшое пояснение для новичков о значениях, которые мы рассматриваем:
• modulus (n) – это модуль. Обычно в задачах на RSA значение n предоставляется. В данном случае n представляет собой длинную строку, начинающуюся с 641646.
• publicExponent (e) – это публичная экспонента. В большинстве случаев она равна 65537, что является стандартом. Пара значений n и e в их совокупности образует открытый ключ.
• privateExponent (d) – это приватная экспонента. Закрытый (приватный) ключ формируется из пары значений d и n. Именно закрытый ключ используется для расшифровки зашифрованного текста. В большинстве задач по RSA необходимо рассчитать или каким-то образом получить значение d. В Redacted RSA 1 d уже известно.
• prime1 (p) – это первый фактор. В этой задачке значение p невозможно извлечь из-за повреждения приватного ключа, но нам это не нужно, так как у нас есть d.
• prime2 (q) – это второй фактор. Произведение первого и второго факторов дает значение n. Аналогично, значение q невозможно извлечь, но это нам не нужно, так как у нас есть d.
Чтобы скопировать конкретное значение с данного сервиса, необходимо щелкнуть по нему левой кнопкой мыши и выбрать опцию "Сopy value".
Еще одной распространенной проблемой, с которой сталкиваются новички, является то, что они не знают, как перевести шифртекст в десятичный формат (base10). В контексте RSA мы обычно работаем с целыми числами. На мой взгляд, наиболее быстрым и доступным способом будет использование языков программирования, например, Python:
Теперь остается только расшифровать флаг. Авторы задачки предлагают использовать команду OpenSSL, однако у новичков это может вызвать трудности. На соревнованиях имеет смысл потратить время более эффективно, вместо того чтобы вспоминать, какая именно команда нужна для расшифровки. Поэтому проще воспользоваться сервисом dCode:
1. Идем на https://dcode.fr/rsa-cipher и вводим значения n, c, e, d в соответствующие поля.
2. Нажимаем кнопку "CALCULATE/DECRYPT" для выполнения расшифровки.
Хотел бы добавить, что задачка по-прежнему доступна для решения, и вы можете повторить описанные шаги.
Redacted RSA 1 от @Max_RSC
Всем привет! Я планирую написать серию разборов задач по криптографии от Google CTF. Вкратце, суть заключается в том, что в каждой последующей задачке приватный ключ становится все более поврежденным. В Redacted RSA 1 нам предоставляется значение d, тогда как в Redacted RSA 2 извлечь d становится невозможно из-за сильного повреждения ключа. Тем не менее, значение d все еще можно рассчитать. Но давайте вернемся к первой, самой простой задачке этой серии.
В первом случае у нас есть часть приватного ключа, которая содержит не только значения открытого ключа (n и e), но и значение приватной экспоненты (d), то есть все необходимые данные для расшифровки. Основная сложность, с которой сталкиваются новички, заключается в том, что они не знают, как извлечь эти значения. Простым и доступным способом решения этой проблемы является использование онлайн-сервиса, такого как:
https://lapo.it/asn1js
Однако, чтобы ключ был правильно прочитан этим сервисом, необходимо выполнить несколько шагов. Во-первых, откройте приватный ключ в любом текстовом редакторе и замените все звездочки (*) на символы, допустимые в base64 (например, на «A»). После этого файл можно загрузить на сервис, который корректно интерпретирует данные. Если при попытке загрузить ключ на сервис возникла ошибка с сообщением наподобие "Error: Content size is not correct for container at offset 6", это означает, что вы что-то сделали не так.
В результате, загрузив наш поврежденный приватный ключ на сервис, мы увидели, что он все еще достаточно целостен, чтобы расшифровать шифртекст: значения n и d сохранились в полном объеме!
Я сделаю небольшое пояснение для новичков о значениях, которые мы рассматриваем:
• modulus (n) – это модуль. Обычно в задачах на RSA значение n предоставляется. В данном случае n представляет собой длинную строку, начинающуюся с 641646.
• publicExponent (e) – это публичная экспонента. В большинстве случаев она равна 65537, что является стандартом. Пара значений n и e в их совокупности образует открытый ключ.
• privateExponent (d) – это приватная экспонента. Закрытый (приватный) ключ формируется из пары значений d и n. Именно закрытый ключ используется для расшифровки зашифрованного текста. В большинстве задач по RSA необходимо рассчитать или каким-то образом получить значение d. В Redacted RSA 1 d уже известно.
• prime1 (p) – это первый фактор. В этой задачке значение p невозможно извлечь из-за повреждения приватного ключа, но нам это не нужно, так как у нас есть d.
• prime2 (q) – это второй фактор. Произведение первого и второго факторов дает значение n. Аналогично, значение q невозможно извлечь, но это нам не нужно, так как у нас есть d.
Чтобы скопировать конкретное значение с данного сервиса, необходимо щелкнуть по нему левой кнопкой мыши и выбрать опцию "Сopy value".
Еще одной распространенной проблемой, с которой сталкиваются новички, является то, что они не знают, как перевести шифртекст в десятичный формат (base10). В контексте RSA мы обычно работаем с целыми числами. На мой взгляд, наиболее быстрым и доступным способом будет использование языков программирования, например, Python:
# Открываем файл
with open('encrypted.txt', 'rb') as file:
byte_data = file.read() # Читаем содержимое файла как байты
# Преобразуем байты в base10
encoded = int.from_bytes(byte_data, 'big')
# Выводим результат
print(encoded)
Теперь остается только расшифровать флаг. Авторы задачки предлагают использовать команду OpenSSL, однако у новичков это может вызвать трудности. На соревнованиях имеет смысл потратить время более эффективно, вместо того чтобы вспоминать, какая именно команда нужна для расшифровки. Поэтому проще воспользоваться сервисом dCode:
1. Идем на https://dcode.fr/rsa-cipher и вводим значения n, c, e, d в соответствующие поля.
2. Нажимаем кнопку "CALCULATE/DECRYPT" для выполнения расшифровки.
Хотел бы добавить, что задачка по-прежнему доступна для решения, и вы можете повторить описанные шаги.
2👍12❤8🔥4🐳1