Le RSA c’est quoi ?
Le RSA est un algorithme de chiffrement asymétrique, c’est à dire qu’on a deux clés qui ont chacune un rôle distinct, une clé publique pour chiffrer les données et une clé privée pour déchiffrer les données chiffrées. Il est normalement impossible de retrouver la clé privée à partir de la clé publique.
Formules RSA
Les formules utiles pour créer les clés, chiffrer, déchiffrer, créer une signature et vérifier une signature seront listées ici.
Création des clés
- On choisit des nombres premiers distincts, \(p\) et \(q\)
- On calcule le module de chiffrement \(n\) avec \(n = p*q\)
- On calcule \(\varphi(n) = (p-1)(q-1)\)
- On choisit un entier naturel \(e\) premier avec \(\varphi(n)\) et \(1 < e < \varphi(n)\), appelé exposant de chiffrement
- On calcule \(d\) avec \(d = e^{-1} \pmod {\varphi(n)} \) et \(d < \varphi(n)\) appelé exposant de déchiffrement
Avec ça on obtient la clé publique \(n\) et \(e\), ainsi que la clé privée \(n\) et \(d\).
Chiffrement
Si \(M \in \mathbb{N}\) et \(M < n\) représentant un message, alors le message chiffré sera représenté par
\[C = M^e \pmod n\]Déchiffrement
Pour déchiffrer \(C\), on utilise \(d = e^{-1} \pmod {\varphi(n)} \), et l’on retrouve le message clair \(M\) par
\[M = C^d \pmod n\]Générer une signature
Pour créer une signature, on chiffre \(hash(M)\) avec la clé privée \(d\) :
\[S = h^d \pmod n\]Vérifier une signature
Pour vérifier une signature, on déchiffre \(S\) avec \(e\):
\[h' = S^e \pmod n\]Ensuite on vérifie que \(h' = h\).
Quelques attaques simples
Les attaques simples qui ne demandent pas un gros bagage en math se trouveront ici. Moi même étant très nul en math et en crypto, il n’y aura ici que très peu d’attaques, qui seront assez simples.
n factorisable
Il est parfois possible de factoriser \(n\) afin de retrouver \(p\) et \(q\). Pour faire cela il a le site factordb. Une fois \(p\) et \(q\) en main, on peut retrouver \(d\) et avoir \(Privkey(n, d)\).
Common factor attack
Dans le cas ou on possède deux clés publiques et que \(n_1\) et \(n_2\) ont un facteur commun, alors il est possible de retrouver \(p\), \(q_1\) ainsi que \(q_2\) :
- \(p = gcd(n_1, n_2)\)
- \(q_1 = \frac{n_1}{p}\)
- \(q_2 = \frac{n_2}{p}\)
Ensuite on a juste à calculer \(d_1\) et \(d_2\).
Exemple de script python :
from math import gcd
def common_factor_attack(n1, n2, c1, c2, e):
p = gcd(n1, n2)
q1 = n1//p
q2 = n2//p
phi1 = (p-1)*(q1-1)
d1 = pow(e, -1, phi1)
m1 = pow(c1, d1, n1)
phi2 = (p-1)*(q2-1)
d2 = pow(e, -1, phi2)
m2 = pow(c2, d2, n2)
return (m1, m2)
Low Exponent Attack
Dans le cas ou \(e\) est tellement petit que \(M^e < n\) alors on peut retrouver \(M\) à partir de \(C\) avec :
\[M = \sqrt[e]{C}\]Oracle de déchiffrement
Le RSA possède des propriétés Homomorphe ce qui signifie que :
\[M(x * y) = M(x) * M(y)\] \[C(x * y) = C(x) * C(y)\]Cela signifie qu’on peut retrouver \(M\) avec \(C_1 = \frac{C}{x}\) et \(C_2 = x\), et \(C_1 \in \mathbb{N}\) ainsi que \(C_2 \in \mathbb{N}\). Il suffit ensuite d’envoyer \(C_1\) et \(C_2\) à l’oracle de déchiffrement pour avoir \(M_1\) et \(M_2\). Pour finir on peut retrouver \(M\) car \(M = (M_1 * M_2) \pmod n\)