IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Les cryptosystèmes RSA et AES-256

Comprendre comment fonctionnent les cryptosystèmes modernes RSA et AES-256 pour échanger des messages confidentiels

Cette documentation propose d'expliquer comment fonctionnent les cryptosystèmes modernes RSA et AES-256, permettant l'échange de données confidentielles. Une application jointe, développée en VBA sous Excel, met en pratique les notions qui seront étudiées.


Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Dans cette documentation, je reprenais les notions de base de la cryptologie pour expliquer pourquoi il est nécessaire, pour échanger des informations confidentielles, d’avoir un mot de passe qui reste secret (ça c’est une évidence) mais aussi, afin de se prémunir des attaques qui permettraient de le casser : qu’il soit aléatoire ; d’une longueur significative ; et surtout renouvelé à chaque chiffrement.

En résumé, le point faible d’un tel cryptosystème (dit symétrique) est la difficulté à communiquer avec un mot de passe différent à chaque échange. D’où l’existence des fameuses valises diplomatiques renfermant des listes sans fin de mots de passe.

Le cryptosystème asymétrique RSA a révolutionné ces pratiques en apportant une solution originale pour échanger des mots de passe, car il se base sur deux clés : une pour chiffrer ; l’autre pour déchiffrer.

Nous allons étudier son principe de fonctionnement, puis comment utiliser les mots de passe ainsi échangés, avec le cryptosystème AES-256, lui aussi réputé pour sa robustesse.


Vous trouverez, en pièce jointe, une application développée en VBA sous Excel qui met en pratique les concepts qui sont abordés dans les chapitres qui suivent.
Cette application est destinée à un usage récréatif ; dans un cadre professionnel, respectez les consignes de votre entreprise et utilisez les outils de chiffrement qu’elle met à votre disposition.


II. La théorie

Cette partie est consacrée au principe de fonctionnement des cryptosystèmes RSA et AES-256 (le premier permettant d'échanger un mot de passe, le second de chiffrer et déchiffrer un message avec ce mot de passe) ainsi qu'à la génération des nombres aléatoires.


II-A. Le cryptosystème RSA

Le cryptosystème asymétrique RSA (nommé par les initiales de ses trois inventeurs, Ronald Rivest, Adi Shamir, Leonard Adleman) utilise deux clés : une pour chiffrer ; l’autre pour déchiffrer.

Exemple :
Alice génère deux clés. La clé pour chiffrer (nous verrons plus loin pourquoi elle est dite publique) est communiquée à Bob, qui va s’en servir pour chiffrer le mot de passe qu’il utilisera dans son message secret. Alice utilise la seconde clé, dite privée car gardée secrète, pour déchiffrer le mot de passe que Bob lui renvoie chiffré.

L’échange du mot de passe s’est fait en tout sécurité, car si la clé publique a été interceptée par un pirate, il pourra certes envoyer un message chiffré à Alice, mais il ne pourra pas déchiffrer le message envoyé par Bob à Alice : parce que les deux clés sont liées mathématiquement entre elles !

Explication :
Pour définir les clés, on prend deux nombres premiers au hasard. Par exemple p = 17 et q = 11.
On calcule leur produit : n = 17 x 11 = 187.
Puis la valeur de l'indicatrice d'Euler en n : φ(n) = (p-1) x (q-1) = (17-1) x (11-1) = 160.
On choisit un entier inférieur à φ(n) et qui est premier avec φ(n) : e = 7.
Enfin on calcule l'inverse de e modulo φ(n) : d = (φ(n)+1) / e = (160+1) / 7 = 23.
Cela donne la clé publique constituée de n et e (187, 7) et la clé privée constituée de n et d (187, 23).
Soit un alphabet où A=1, B=2, C=3, etc.
Pour chiffrer « C » nous utilisons la clé publique dans la formule suivante : Code = reste de (3e/n).
Soit le reste de 37/187 = 2187 - (Entier(2187/187) x 187) = 130.
Pour déchiffrer « 130 » nous utilisons la clé privée dans la formule suivante : Lettre = reste de (130d/n).
Soit le reste de 13023/187 = 3, qui correspond à « C ».

Pourquoi ce cryptosystème est si fiable :
Un pirate, qui connait la clé publique, intercepte le cryptogramme « 130 ».
Pour le déchiffrer, il doit appliquer la formule : Lettre = reste de (130d/n).
Il connait « n », qui vaut 187, et « e » qui vaut 27.
Mais il lui manque « d », qui est (p-1) x (q-1) / e.
Donc il lui manque les deux nombres premiers « p » et « q » qui constituent « n ».
Et c'est là toute la difficulté, car il n'existe (actuellement) aucune méthode pour factoriser rapidement un grand nombre (au moins 200 chiffres) pour retrouver les deux nombres premiers qui le composent.

Vous comprenez désormais pourquoi la clé pour chiffrer est dite publique, même si, dans l’idéal, elle ne doit pas être divulguée.
Notez qu’elle peut être réutilisée plusieurs fois, contrairement au mot de passe qui doit être renouvelé à chaque échange.

Le cryptosystème RSA utilise des mathématiques complexes et manipule des nombres à plusieurs centaines de chiffres, ce qui demande des temps de traitement importants. Il n’est donc employé que pour chiffrer et déchiffrer le mot de passe qui sera utilisé dans un cryptosystème symétrique, et surtout pas pour l’ensemble du message secret, ou d’un fichier, car ça prendrait trop de temps.

Par convention, le mot de passe sera de 32 caractères (256 bits) aléatoires. Il servira pour chiffrer et déchiffrer le message confidentiel, par un cryptosystème symétrique rapide et robuste : le cryptosystème AES-256.


II-B. Le cryptosystème AES-256

Un passage sur Internet vous rassurera sur les qualités du cryptosystème AES-256 : rapidité et robustesse.

J’ai glané un code en VBA qui permet de l’implémenter (les sources sont documentées dans le module « AES_Rijndael » du classeur joint). N’ayant pas les compétences pour vous en dire plus sur l’algorithme, je passe la main à l’Intelligence Artificielle :

« Voici une explication simple et claire du fonctionnement du cryptosystème AES-256, pensée pour un public curieux mais novice.
AES signifie Advanced Encryption Standard.
Le 256 indique que la clé utilisée pour chiffrer les données fait 256 bits de long, soit un nombre de combinaisons astronomique : 2256 possibilités — plus que le nombre d’atomes dans l’univers observable.
AES-256 est un algorithme de chiffrement symétrique (même clé pour chiffrer et déchiffrer).

Étapes du chiffrement AES-256 :
Les données sont découpées en blocs de 128 bits (16 octets).
Chaque bloc passe par 14 transformations successives, appelées rounds :
1. SubBytes : chaque octet est remplacé par un autre via une table secrète (S-box).
2. ShiftRows : les lignes du bloc sont décalées.
3. MixColumns : les colonnes sont mélangées pour diffuser l’information.
4. AddRoundKey : une sous-clé est ajoutée au bloc.
Ces étapes rendent les données méconnaissables, même si elles contiennent des motifs répétitifs.

Et la clé de 256 bits ?
Elle ne sert pas directement à chiffrer. Elle est utilisée pour générer plusieurs sous-clés, une pour chaque round. C’est comme si on utilisait 14 versions différentes de la clé pour brouiller les données à chaque étape.
 »

En résumé :

Les étapes pour chiffrer un message sont les suivantes :

  • un mot de passe aléatoire est généré ;
  • le message confidentiel est chiffré par AES-256 avec ce mot de passe ;
  • le mot de passe est chiffré par RSA avec la clé publique ;
  • puis ajouté en en-tête du cryptogrammme.

Pour déchiffrer :

  • le mot de passe chiffré est extrait de l'en-tête du cryptogramme ;
  • il est déchiffré par RSA avec la clé privée ;
  • puis utilisé par AES-256 pour déchiffrer le reste du cryptogramme.

Nous savons qu’un mot de passe fiable doit être aléatoire et d'une longueur significative. Oubliez les classiques « 123456 », « TOTO », etc., que casserait un amateur.
Voyons maintenant comment générer un mot de passe aléatoire…


II-C. Générer un mot de passe aléatoire

Générer un mot de passe aléatoire est plus compliqué qu’il n’y parait.
La fonction « Rnd », que le VBA fournit, ne renvoie qu’un nombre pseudo-aléatoire avec un cycle de génération de 16 777 216 graines. Dit autrement, elle ne peut fournir qu’un peu plus de 16 millions de combinaisons différentes. Ce qui rend le mot de passe facilement cassable, car il suffit de les tester une à une. Vous comprendrez mieux en analysant le pseudocode de la fonction « Rnd » qui ressemble à ceci :

Graine = (MULTIPLIER x Graine + INCREMENT) Mod MODULO
Rnd = Graine / MODULO

Avec :
MULTIPLIER = 1 140 671 485
INCREMENT = 123 456 (ou le chiffre de votre choix)
MODULO = 16 777 216

Une fois le cycle terminé, la fonction reprend au début du cycle.
Ci-dessous un code qui le démontre, où la première colonne affiche le cycle, et la seconde la valeur renvoyée :

Image non disponible


Démonstration avec un mot de passe de 32 caractères généré par la fonction « Rnd », que l’on pense aléatoire :

 
Cacher/Afficher le codeSélectionnez
Function GeneratePassword() As String
    Randomize Timer * 100
    For i = 1 To 32
        GeneratePassword = GeneratePassword & Chr(Int(Rnd() * 26) + 65) ' lettres A-Z
    Next i
End Function


La fonction « GeneratePassword » va renvoyer, par exemple : « DWGJIUCDMNUTVAYQIHDKEPBJOBYAWJID »

Cette combinaison est retrouvée (en quelque secondes) en parcourant les 224 possibilités du cycle :

 
Cacher/Afficher le codeSélectionnez
Sub CrackPassword()
    For Graine = 1 To 16777216
        Randomize Graine
        Test = ""
        For i = 1 To 32
            Test = Test & Chr(Int(Rnd() * 26) + 65)
        Next i
        If Test = "DWGJIUCDMNUTVAYQIHDKEPBJOBYAWJID" Then
            MsgBox "Mot de passe retrouvé ! Graine : " & Graine
            Exit Sub
        End If
    Next Graine
End Sub


Cette fonction est donc déconseillée en cryptologie, car elle ne génère pas assez de combinaisons.
Il est possible d’utiliser un autre générateur de nombre pseudo-aléatoires, comme l’algorithme Wichmann-Hill qui a un cycle de génération de 6 953 607 871 644 graines, mais cela ne résout pas fondamentalement le problème.

Heureusement, Windows met à notre disposition l’API « BCryptGenRandom », qui me semble plus sûre pour renvoyer un nombre aléatoire.

Dans l’application jointe, elle sera employée pour générer les nombres premiers de 100 chiffres qui constituent les clés RSA ; et à chaque échange de message secret, un mot de passe de 32 caractères de 4 bits (compris entre 0 à 9, A à F), soit 1632 combinaisons ; ainsi que par le cryptosystème AES-256 pour générer son vecteur aléatoire de 16 chiffres.

Maintenant que vous maitrisez les principes de fonctionnement des cryptosystèmes RSA et AES-256, voyons plus en détail leur utilisation dans l’application jointe…


III. La pratique

Cette partie est consacrée à la mise en pratique de ce que nous venons d'étudier, avec une application développée en VBA pour Excel, qui permet d'échanger des messages secrets, mais aussi des fichiers.

Voici un aperçu de son menu :


Image non disponible


III-A. La gestion des clés

Pour qu’Alice puisse lire les messages secrets de Bob, il faut avant tout qu’elle génère les clés RSA, et qu’elle communique à Bob la clé publique de chiffrement.
Cela se fait dans le menu « Gestion des clés ».


III-A-1. Générer des clés RSA

Le formulaire est disponible depuis le menu « Gestion des clés / Générer de nouvelles clés ».


Image non disponible


Cliquez sur « GO » pour lancer le traitement. Quand les clés sont calculées, indiquez l’identifiant de la clé, dans notre exemple Alice va saisir « Bob ». Et cliquez sur « Enregistrer la clé ». La clé est enregistrée dans le presse-papiers, prête à être communiquée par le moyen qui vous semble le plus sûr. Rassurez-vous, il existe une autre façon de récupérer la clé pour la diffuser.


- Vous pouvez modifier la clé et prévenir Bob que le premier chiffre n’est pas 5 mais 8 : un pirate qui l’intercepterait, et n’étant pas dans la confidence, ne pourrait pas l’exploiter.
- La génération des clés prend environ 5 minutes. Pensez à en générer d’avance, que vous nommerez « Clé disponible », pour en avoir sous la main en cas d’urgence.


Cette application, à but uniquement récréatif, utilise deux nombres premiers de 100 chiffres, soit une clé RSA de 200 chiffres.
Sachez qu'en 2005 une clé de 200 chiffres (soit 663 bits) a été cassée. Le dernier record semble être celui de 2020 avec une clé de 250 chiffres (soit 829 bits).
La norme préconise l'usage d'une clé de 1 024 bits (309 chiffres), voire 2 048 bits (617 chiffres). L'application jointe peut être paramétrée pour générer une clé de 310 chiffres mais sa génération prendra 20 minutes au lieu de 5 minutes, c'est pourquoi je n'ai pas retenu cette solution.


III-A-2. Ajouter une nouvelle clé de chiffrement RSA

Le formulaire est disponible depuis le menu « Gestion des clés / Ajouter une clé de chiffrement reçue ».


Image non disponible


Bob copie/colle la clé de chiffrement envoyée par Alice. Il saisit l’identifiant pour la reconnaitre facilement dans le cas où il a plusieurs correspondants. Et valide la clé pour l’enregistrer dans l’application.


III-A-3. Communiquer une clé de chiffrement RSA

Le formulaire est disponible depuis le menu « Gestion des clés / Communiquer une clé de chiffrement ».


Image non disponible


Sélectionnez la clé concernée (cliquez sur « + » pour ouvrir l’arbre de sélection et descendre jusqu'au niveau de l'identifiant).
Cliquez sur « Valider la sélection » pour copier la clé publique dans le presse-papiers.
Et communiquez-la par le moyen qui vous semble le plus sûr.


III-A-4. Renommer une clé RSA

Le formulaire est disponible depuis le menu « Gestion des clés / Renommer une clé ».


Image non disponible


Sélectionnez la clé concernée (cliquez sur « + » pour ouvrir l’arbre de sélection et descendre jusqu’au niveau de l'identifiant).
Cliquez sur « Valider la sélection ».
Saisissez l’identifiant de votre choix.
Cliquez sur « Enregistrer le nouvel identifiant ».


III-A-5. Supprimer une clé RSA

Le formulaire est disponible depuis le menu « Gestion des clés / Supprimer une clé ».

Si vous n'envisagez plus de communiquer avec un correspondant, supprimer les clés RSA utilisées permet de sécuriser vos échanges, au cas où votre ordinateur est piraté.


Sélectionnez la clé concernée (cliquez sur « + » pour ouvrir l’arbre de sélection et descendre jusqu’au niveau de l'identifiant).
Cliquez sur « Valider la sélection » pour effacer la clé de l’application.


III-B. Chiffrer un message ou un fichier

Vous devez disposer d’au moins une clé de chiffrement, reçue de votre correspondant, pour pouvoir chiffrer un message ou un fichier.


1 - Si vous ne disposez que d’une clé, elle est reprise automatiquement, sinon vous devrez en choisir une en cliquant sur « Sélectionnez la clé que vous a communiqué le destinataire pour chiffrer vos messages ». Notez que la dernière clé utilisée est reprise par défaut.


Image non disponible

2 - Saisissez, ou collez, le texte en clair qu’il faut chiffrer.
3 - Vous pouvez lancer le correcteur orthographique (la grammaire n’est pas gérée), les mots en majuscule ne sont pas analysés.
4 - Si besoin, sélectionnez un fichier à chiffrer.
5 - Cliquez ici pour chiffrer le texte et le fichier. Le cryptogramme est copié automatiquement dans le presse-papiers. Il s’affiche en bas (7). Si un fichier était à chiffrer, l’extension « AES » est ajoutée au fichier chiffré et le lien s’affiche en (8).
6 - Si vous disposez d’Outlook, vous pouvez générer automatiquement un message qui reprend le cryptogramme dans le corps du message (en bleu) et ajoute le ficher en pièce jointe.


III-C. Déchiffrer un message ou un fichier

Vous devez disposer d’au moins une clé de déchiffrement, pour pouvoir déchiffrer un message ou un fichier reçu de votre correspondant.


1 - Si vous ne disposez que d’une clé, elle est reprise automatiquement, sinon vous devrez en choisir une en cliquant sur « Sélectionnez la clé pour déchiffrer les messages de votre correspondant ». Notez que la dernière clé utilisée est reprise par défaut.


Image non disponible

2 - Collez le texte chiffré qu’il faut déchiffrer.
3 - Si besoin, sélectionnez le fichier à déchiffrer.
4 - Cliquez ici pour déchiffrer le texte et le fichier. Le texte en clair est copié automatiquement dans le presse-papiers. Il s’affiche en bas (6). Si un fichier était à déchiffrer, le lien s’affiche en (7).
5 - La gomme efface les textes en clair et vide le presse-papiers.


Vous remarquerez que le cryptogramme (2) contient une série de chiffres qui se termine par « @ ». Cette partie correspond au mot de passe chiffré par RSA, la suite représente le message secret codé par AES-256 avec ce mot de passe.
La première étape, la plus longue (environ 7 secondes), est de déchiffrer ce nombre d'une centaine de chiffres par RSA, pour en extraire le mot de passe. La seconde, pour déchiffrer par AES-256 le message secret codé avec ce mot de passe, est bien plus rapide, quelle que soit la taille du message.


III-D. En résumé

Bob doit envoyer un message confidentiel à Alice :

  • Alice génère des clés RSA (voir III-A-1) et communique à Bob la clé publique de chiffrement (voir III-A-3) ;
  • Bob enregistre cette clé (voir III-A-2) et chiffre son message avec (voir III-B), et envoie le cryptogramme obtenu à Alice ;
  • Alice déchiffre le cryptogramme avec la clé privée (voir III-C).

Si Alice désire répondre à Bob, elle lui demande une clé publique de chiffrement, qu'elle enregistre et utilise pour chiffrer son message. Que Bob déchiffre avec sa clé privée.

Par la suite les clés RSA seront réutilisées, il n'est pas nécessaire d'en générer à chaque échange, car la méthode est fiable.


IV. Conclusion

Nous avons présenté le principe de fonctionnement de deux cryptosystèmes célèbres qui travaillent ensemble pour échanger nos messages secrets :

  • RSA, qui est un cryptosystème asymétrique, permet d'échanger des mots de passe en toute sécurité, via un modèle mathématique complexe et chronophage ;
  • AES-256, qui est un cryptosystème symétrique, permet de chiffrer et déchiffrer rapidement un message avec le mot de passe préalablement communiqué.

L'application jointe met en pratique ces principes.

Mais, comme indiqué dans l'introduction, cette application ne doit être utilisée que pour un usage récréatif.
Dans un cadre professionnel, respectez les consignes de votre entreprise et utilisez les outils de chiffrement qu’elle met à votre disposition.


Si cela vous intéresse, vous trouverez dans le fichier joint les codes sources en VBA (non détaillés ici car ce n'est pas le but de cette documentation) que vous adapterez à votre langage de progammation pour développer votre propre application.


Bonne programmation.
Laurent OTT.
2025.


V. Remerciements

Je remercie gaby277 et User pour leur relecture et leurs conseils, et x pour sa correction orthographique.
Ainsi que toute l’équipe de Developpez.com qui participe à la maintenance du site.


VI. Le fichier joint

Le fichier Cryptosysteme.xlsm est l'application étudiée.
Vous devez disposer d'une version d'Excel 2010 ou suppérieure.
Au premier lancement, une alerte sécurité vous demandera de confirmer les macros.

Vous pouvez accéder au code source par la combinaison [Alt]+[F11].

Des clés RSA sont enregistrées pour servir d'exemple, elles devront être supprimées par la suite.


VII. ANNEXE - Note technique sur la génération des clés RSA

Comme vu dans l’introduction, nous avons besoin de deux grands nombres premiers pour constituer les clés de chiffrement et de déchiffrement.

Il n’existe pas en VBA (et dans de nombreux langages de programmation) de fonctions mathématiques natives pour manipuler des nombres de 100 chiffres. J’ai dû glaner sur Internet les fonctions qui traitent les grands nombres en chaînes de caractères et réalisent les opérations arithmétiques nécessaires, ainsi que le test de primalité Miller-Rabin pour déterminer si un nombre est premier ou pas.

En principe, une fois un grand nombre impair choisi aléatoirement, il suffit de boucler en l’incrémentant de 2 tant qu’il n’est pas premier.

Mais j’ai apporté ma touche :
J’ai appliqué une formule (personnelle) pour multiplier par deux la probabilité d’obtenir un nombre premier, ce qui diminue d’autant les temps de traitement :
Avec C = (Pi x Pk) / 5
Où les Pi sont des nombres premiers distincts successifs supérieurs à 2 et différents de 5, et n un entier supérieur à 2, alors Int(1/3 Cn) + Int(2/3 Cn) + 1 à une probabilité d’être un nombre premier supérieur à 1 / ln(Cn) - 1.
Ainsi, quand « C » vaut (3 x 7 x 11 x 13 x 17) / 5, la probabilité d’obtenir un nombre premier est multipliée par 2,22. Car sont ôtés du tirage les nombres divisibles par 3, 7, 11, 13, 17, et 5.

Le calcul des clés est identique à celui repris dans l’introduction, le choix de « e », conformément aux recommandations, est priorisé sur les valeurs 65 537, 257 et 97.


Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Licence Creative Commons
Le contenu de cet article est rédigé par Laurent Ott et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2025 Developpez.com.