M4x
Green Team
- 20.05.2024
- 15
- 19
Без лишних предисловий перейдем к делу.
У нас есть три шифртекста, которые на самом деле представляют одно и то же сообщение. Подсказка намекает на то, что Боб не слишком хорошо разбирается в RSA и допустил серьезную ошибку при шифровании. Мы видим, что вместо стандартной экспоненты e = 65537 он использовал значения 5, 7 и 13. А модули n1, n2 и n3 такие маленькие, что их легко разложить на множители. Это можно назвать критической уязвимостью.
Чтобы решить эту задачку тем способом, который я предлагаю, вам потребуется хорошее знание Python.
Если мы возьмем первое сообщение и попытаемся вычислить приватную экспоненту d, то у нас ничего не выйдет:
На простом языке это означает, что Боб допустил фатальную ошибку в процессе шифрования.
Пробуем второе сообщение — и снова та же история:
Но вот третье сообщение, по-видимому, зашифровали правильно, и мы можем вычислить d:
Теперь, когда у нас есть d, расшифровать флаг — проще простого:
В итоге мы получаем трехзначное число, которое, разумеется, я вам не покажу, чтобы вы не жульничали, а решили таск самостоятельно и научились чему-нибудь новому.
Вернемся к условию задачки:
Нас просят указать SHA256 от расшифрованного сообщения. Это делается очень просто:
Получившуюся строку оборачиваем в CODEBY и сдаем флаг.
У нас есть три шифртекста, которые на самом деле представляют одно и то же сообщение. Подсказка намекает на то, что Боб не слишком хорошо разбирается в RSA и допустил серьезную ошибку при шифровании. Мы видим, что вместо стандартной экспоненты e = 65537 он использовал значения 5, 7 и 13. А модули n1, n2 и n3 такие маленькие, что их легко разложить на множители. Это можно назвать критической уязвимостью.
Чтобы решить эту задачку тем способом, который я предлагаю, вам потребуется хорошее знание Python.
Если мы возьмем первое сообщение и попытаемся вычислить приватную экспоненту d, то у нас ничего не выйдет:
Python:
>>> e1 = 5
>>> p1 = 181
>>> q1 = 331
>>> n1 = 181 * 331 # 59911
>>> phi_n1 = (p1 - 1) * (q1 - 1)
>>> d = pow(e1, -1, phi_n1)
# Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: base is not invertible for the given modulus
Пробуем второе сообщение — и снова та же история:
Python:
>>> e2 = 7
>>> p2 = 449
>>> q2 = 809
>>> n2 = 449 * 809 # 363241
>>> phi_n2 = (p2 - 1) * (q2 - 1)
>>> d = pow(e2, -1, phi_n2)
# Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: base is not invertible for the given modulus
Python:
>>> e3 = 13
>>> p3 = 647
>>> q3 = 727
>>> n3 = 647 * 727 # 470369
>>> phi_n3 = (p3 - 1) * (q3 - 1)
>>> d = pow(e3, -1, phi_n3)
Python:
>>> С3 = 76794
>>> message = pow(С3, d, n3)
Вернемся к условию задачки:
Код:
Боб шифрует для трех сторон одно и то же сообщение с помощью RSA.
Узнайте сообщение, отправленное Бобом. Во флаге укажите SHA256 от сообщения.
Python:
>>> from hashlib import sha256
>>> result = sha256(str(message).encode()).hexdigest()