RSA — Cryptographie asymétrique

Asymétrique CTF

Les mathématiques RSA

n = p*q    (p et q : grands nombres premiers secrets)
phi(n) = (p-1)*(q-1)
e = 65537  (exposant public)
d = e^(-1) mod phi(n)  (exposant privé)

Chiffrement : c = m^e mod n
Déchiffrement : m = c^d mod n

Clé publique : (n, e)
Clé privée   : d (ou p, q, d)

Attaques classiques en CTF

# 1. n factorisable
factordb.com  ou  sympy.factorint(n)

# 2. e=3 + message petit (m^3 < n)
from gmpy2 import iroot
m, exact = iroot(c, 3)

# 3. Wiener (d trop petit)
from owiener import attack
d = attack(e, n)

# 4. Hastad (même message chiffré pour 3 personnes, e=3)
from sympy.ntheory.modular import crt

# 5. n en commun entre 2 clés
from math import gcd
p = gcd(n1, n2)  # -> on a p !