RSA 暗号で素数を使い回すことにしました!
import os
from Crypto.Util.number import getPrime, bytes_to_long
flag = os.environ.get("FLAG", "Alpaca{****** REDACTED ******}").encode()
assert len(flag) == 30
p = getPrime(128)
n = p * p # !?
e = 65537
m = bytes_to_long(flag)
c = pow(m, e, n)
print(f"{n = }")
print(f"{c = }")
The modulus is not p*q, but a prime square: n = p^2.
Since n = p^2, we can recover p immediately by:
p = isqrt(n)
For prime powers:
$\phi(p^2)=p^2-p=p(p-1)$
Then standard RSA steps work:
import math
from Crypto.Util.number import *
n = 66579369096057840799275275806551056825754855027296356876541315429102104919401
p = math.isqrt(n)
phi = p*(p-1)
e = 65537
d = pow(e, -1, phi)
c = 23240514848563033397887056861198100244595942784363115352574337396646368790635
m = pow(c, d, p*p)
print(long_to_bytes(m))