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\):
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\).