No Padding, No Problem (90)
RSA chosen-ciphertext attack (CCA)
Problem
Oracles can be your best friend, they will decrypt anything, except the flag's ciphertext. How will you break it? Connect with nc mercury.picoctf.net 30048.
Solution
This is a chosen-ciphertext attack (CCA) against RSA. We are able to choose any ciphertext, except the flag's ciphertext, to decrypt.
TL;DR: we can use as the ciphertext, then halve the result.
Proof
Note that:
is chosen such that , i.e. .
The decryption of would yield:
From Euler's Theorem, if , then
Thus, we have
At this point, we can halve the result to get .
Script
from Crypto.Util.number import *
from pwn import *
from decimal import *
import re
getcontext().prec = 1000
conn = remote('mercury.picoctf.net', 30048)
raw_text = conn.recvuntil('Give me ciphertext to decrypt:').decode()
print(raw_text)
m = re.search(r"n: ([0-9]+)\ne: ([0-9]+)\nciphertext: ([0-9]+)", raw_text)
n = int(m[1])
e = int(m[2])
c = int(m[3])
to_decrypt = c * pow(2, e, n) % n
conn.send(str(to_decrypt) + '\r\n')
print("Sent:", to_decrypt)
result = conn.recvline().decode()
print(result)
m = re.search(r"([0-9]+)", result)
result = int(Decimal(m[1]) / 2)
print(hex(result))
print('Result:', long_to_bytes(result))References
Last updated
Was this helpful?