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?