Skip to content

RSA Attacks

crypto rsa

RSA parametre hataları (küçük d, ortak p/q, padding yok, stereotip plaintext) pratikte ciphertext’i açar. Önce n,e,c profili; sonra uygun saldırıyı seç.

  1. n,e,c (ve varsa p,q,dp,dq) çıkar; bit uzunluklarını ölç.

  2. factordb / Fermat / Pollard ile n’yi faktörlemeyi dene.

  3. Wiener / boneh-durfee (küçük d), common modulus, related message uygula.

  4. PKCS#1 v1.5 oracle veya stereotip Coppersmith ile bitir.

Terminal window
openssl rsa -pubin -in pub.pem -text -noout
from Crypto.PublicKey import RSA
k=RSA.import_key(open('pub.pem').read()); print(k.n.bit_length(), k.e)
from Crypto.Util.number import *
n,e,c = ...
print(n.bit_length(), e)
Terminal window
curl "http://factordb.com/api?query=$N"
# Fermat (p≈q)
import gmpy2
a=gmpy2.isqrt(n)+1
while not gmpy2.is_square(a*a-n): a+=1
b=gmpy2.isqrt(a*a-n); p,q=a-b,a+b
Terminal window
yafu 'factor(N)'
Terminal window
msieve -v N
# small e + short message: e-th root
from Crypto.Util.number import long_to_bytes
import gmpy2
m=gmpy2.iroot(c,e)[0]; print(long_to_bytes(m))
# Wiener (küçük d)
# RsaCtfTool / owiener
Terminal window
RsaCtfTool.py -n N -e E --uncipher C
Terminal window
RsaCtfTool.py -n N -e E --attack wiener
# common modulus: aynı m, farklı e1,e2, gcd(e1,e2)=1
# m = c1^a * c2^b mod n
# CRT fault: bad signature → p
# p = gcd(s^e - h, n)
from Crypto.Util.number import inverse, long_to_bytes
phi=(p-1)*(q-1); d=inverse(e,phi); print(long_to_bytes(pow(c,d,n)))
Terminal window
rsatool.py -n N -p P -q Q -e E
[ ] n/e/c bit uzunlukları alındı
[ ] factordb/Fermat denendi
[ ] Wiener/common modulus/related msg denendi
[ ] plaintext elde edildi