I Learned Blog

🧭 Explorer 🔍 Chercher 🏠 Site principal

RSA, comment ça marche ?

RSA est sûrement l'algorithme de chiffrement asymétrique le plus connu, il est utilisé chaque jour par des millions d'appareils, même le certificat TLS du site que vous visitez en ce moment est basé sur RSA ! Cet article détaillera le fonctionnement mathématique de RSA, aucun prérequis n'est nécessaire (à part peut-être une tasse de café ☕).

La cryptographie asymétrique, qu'est-ce que c'est ?

Il existe deux types d'algorithmes de chiffrement

  • Les algorithmes de chiffrement symétriques : ils impliquent d'avoir un secret (un "mot de passe") partagé entre les différents appareils. Ce genre d'algorithme a pour avantage d'être plutôt rapide mais a pour inconvénient, et pas des moindres, de devoir avoir un canal sécurisé pour transmettre le secret.
  • Les algorithmes de chiffrement asymétriques : ces algorithmes, dont RSA fait partie, ne nécessitent pas de partager un secret à l'avance. Ils se basent sur une paire de clés (une publique et une privée) liées mathématiquement. Cet algorithme a donc pour avantage de ne pas nécessiter un canal sécurisé pour initier la connexion, mais pour inconvénient d'être nettement moins rapide que les algorithmes de chiffrement symétriques.

Alors, comment fonctionne RSA ?

Cette partie sera un peu plus mathématique mais devrait être accessible pour tout le monde. Si vous avez des questions, n'hésitez pas à les poser dans les commentaires en bas de cet article !

Génération des clés

  1. On choisit deux nombres premier distincts pp et qq (pour rappel, un nombre premier est un nombre qui n'a que deux diviseurs, 1 et lui-même.)

    p=5q=13p = 5 \\ q = 13

  2. On calcule nn le produit de pp et qq.

    n=5×13n=65n = 5×13 \\ n = 65

  3. On calcule la valeur indicatrice d'Euler en nn. L'indicaquoi ? 🤨 La valeur indicatrice d'Euler c'est une fonction notée ϕ\phi qui, à tout entier naturel nn associe le nombre d'entiers naturels compris entre 1 et nn et premiers avec nn. Premier avec ? 🤔 Quand deux nombres sont premiers entre eux, ça veut simplement dire qu'ils n'ont aucun facteur premier en commun.

    Par exemple, 12 est premier avec 5 car dans la décomposition en facteurs premiers de 12 ($2\times2\times3$) on ne retrouve pas 5

    Voici un petit exemple de la valeur indicatrice d'Euler qui devrait vous permettre de bien comprendre :

    ϕ(12)=4(1,5,7,11)\phi(12) = 4 \\ \small{(1, 5, 7, 11)}

    Les nombres 1, 5, 7 et 11 sont bien premiers avec 12.

    Nous allons donc calculer la valeur indicatrice d'Euler en nn. Pour calculer cette dernière, il faut connaitre les propriétés suivantes :

    ϕ(a×b)=ϕ(a)×ϕ(b)\phi(a\times b) = \phi(a)\times \phi(b)

    Pour n'importe quel nombre premier c, ϕ(c)=c1\phi(c)=c-1

    Avec ces deux propriétés en tête et sachant que p et q sont deux nombres premiers, on peut affirmer que

    ϕ(p)=p1ϕ(q)=q1ϕ(n)=ϕ(p×q)=ϕ(p)×ϕ(q)ϕ(n)=(p1)×(q1)\phi(p) =p - 1 \\ \phi(q) = q-1 \\ \phi(n) = \phi(p \times q) = \phi(p) \times \phi(q) \\ \phi(n) = (p - 1) \times (q - 1)

    On remplace par nos valeurs d'exemple

    ϕ(5)=51ϕ(13)=131ϕ(5×13)=ϕ(5)ϕ(13)ϕ(65)=(51)(131)ϕ(65)=412ϕ(65)=48\phi(5) = 5 - 1 \\ \phi(13) = 13-1 \\ \phi(5 \times 13) = \phi(5)*\phi(13) \\ \phi(65) = (5 - 1)(13 - 1) \\ \phi(65) = 4*12 \\ \phi(65) = 48 \\

  4. On choisit un entier naturel ee premier avec ϕ(n)\phi(n) (qui est donc ici 48).

    e=5e = 5

  5. On calcule dd, l'inverse modulaire de ee modulo nn. L'inverse modulaire ? Modulo ? Qu'est-ce que c'est ces trucs ? 🧐 Pour comprendre le concept d'inverse modulaire, il est nécessaire de comprendre ce qu'est la congruence sur les entiers. Deux entiers aa et bb sont dits congrus modulo nn si le reste de la division euclidienne de aa par nn et de bb par nn est identique. Par exemple 33 et 9 sont dits congrus modulo 12 car le reste de la division euclidienneHee de 33 par 12 est 9, et que le reste de la division euclidienne de 9 par 12 est 9. On note cela de la façon suivante :

    339mod1233 et 9 sont congrus modulo 1233 \equiv 9 \mod{12} \\ \small\textit{33 et 9 sont congrus modulo 12}

    Une autre façon de se représenter la chose serait d'imaginer une horloge (avec donc 12 heures), si on fait tourner l'aiguille des heures de 9 heures ou de 33, elle se retrouvera au même endroit à la fin.

    Horloge tournant 33 heures et horloge tournant 9 heurs

    Donc, calculer l'inverse modulaire d'un entier aa modulo nn c'est trouver un entier uu résolvant l'équation :

    au1modnau \equiv 1 \mod{n}

    Ce qui revient donc à chercher un nombre uu tel que le reste de la division euclidienne de a×ua \times u par n soit égal au reste de la division euclidienne de 1 par ee.

    Comment déterminer uu ? Et bien pas de formule magique, il suffit de bruteforcer tous les nombres entiers entre 0 et nn. On note cela :

    u 0 ; n u \in~ ⟦0~;~n⟧

    Dans notre exemple, on veut calculer l'inverse modulaire de ee modulo ϕ(p×q)\phi(p\times q). On fait donc

    5d1mod485291mod48d=295d \equiv 1 \mod{48} \\ 5*29\equiv 1 \mod 48 \\ d = 29

    Et c'est fini ! On a nos clés publiques et privées. Le couple (n,e) est notre clé publique et le nombre d notre clé privée.

Chiffrement d'un message

Maintenant que l'on a notre paire de clés, on peut chiffrer notre premier message.

Soit M, le message que l'on souhaite chiffrer strictement inférieur à n, on calcule C le message chiffré de la façon suivante.

MeCmodnM^{e}\equiv C \mod n

Exemple avec M = 42

425Cmod6542522mod6542^{5}\equiv C \mod 65 \\ 42^5 \equiv 22 \mod 65

Le message chiffré pour notre clé publique est donc 22

Déchiffrement d'un message

Une fois notre message chiffré, on peut le déchiffrer en appliquant la formule suivante :

MCdmodnM2229mod65M=42M \equiv C^d \mod n \\ M \equiv 22^{29} \mod 65 \\ M = 42

Décryptage d'un message

Petit rappel, décrypter un message consiste à déterminer le contenu du dit message sans connaitre la clé utilisée pour le chiffrer.

Pour décrypter un message, il faut trouver l'inverse modulaire de ee modulo nn ce qui n'est pas possible sans connaître pp et qq. Le seul moyen est donc bruteforcer en vérifiant pour chaque nombre qu'il est premier, mais aussi que le produit de ces deux nombres n'est pas factorisable.

Conclusion

La robustesse de RSA se base donc sur la complexité calculatoire des algorithmes de vérification de primauté de très grands nombres. Le problème est que pour créer des clés toujours plus robustes, il faut augmenter la taille de la clé ce qui peut devenir contraignant. Afin de répondre à cette problématique, et à d'autres que nous aborderons plus tard, ont été introduites des fonctions de chiffrement asymétrique basées sur les courbes elliptiques.