Comme vous l’avez vu dans la partie précédente, le chiffrement symétrique permet d'échanger des données chiffrées sur un canal non sécurisé. Cependant, ce système nécessite d'échanger la clé de chiffrement entre l'expéditeur et le destinataire d'un texte chiffré. Cela pose un problème lors d'un échange à distance par exemple : comment échanger la clé de manière confidentielle si l'on ne dispose pas de canal de communication sécurisé ?
Découvrez l'échange de clés Diffie-Hellman
En 1976, les cryptologues Diffie et Hellman ont proposé une solution révolutionnaire à ce problème : le protocole d'échange de clés Diffie-Hellman. Ce système a posé les bases de la cryptographie asymétrique et a permis de généraliser l'usage de la cryptographie dans les communications informatiques.
L'échange de clés Diffie-Hellman consiste à échanger une clé secrète entre Alice et Bob sur un réseau non sécurisé de manière confidentielle. Il se déroule comme ceci :
Alice choisit un entier aléatoire g et un entier aléatoire de grande taille a qui est sa clé privée.
Elle calcule A = exp(a) = g^a (g à la puissance a). a est la clé privée d'Alice et A est la clé publique d'Alice.
Alice transmet à Bob la valeur de g et de A, sa clé publique.
De même, Bob choisit un entier aléatoire de grande taille b. Il calcule B = exp(b) = g^b. b est la clé privée de Bob et B est la clé publique de Bob.
Bob transmet à Alice B, sa clé publique.
À ce moment, Alice calcule B^a = g^(b*a) et Bob calcule A^b = g^(a*b). Ces deux variables ont la même valeur, car x^a*b = x^b*a. Cette variable B^a est la clé secrète partagée par Alice et Bob.
Imaginons maintenant qu'une tierce personne, qu'on appellera Ève, ait écouté toutes les communications entre Alice et Bob. Ève connait g, A = g^a et B = g^b. Cependant, Ève ne peut pas calculer a car la fonction log(A) = log(g^a) = a est impossible à calculer. De même, elle ne peut pas calculer b. Ève ne peut donc pas calculer B^a ou A^b. Cette variable est donc confidentielle entre Alice et Bob, qui peuvent l'utiliser comme clé secrète partagée pour chiffrer leurs échanges de manière confidentielle avec le chiffrement symétrique.
Le chiffrement asymétrique avec RSA
L'année suivant, en 1977, les cryptologues Rivest, Shamir et Adleman ont déposé un brevet pour le système de chiffrement asymétrique RSA basé sur le problème de la factorisation des grands nombres. Ce système a permis le développement du chiffrement à clé publique. Il repose sur une paire de clés privée et publique, et sur des fonctions de chiffrement et de déchiffrement définies comme ceci :
soit m le message en clair, c le texte chiffré, PriB la clé privée de Bob, PubB la clé publique de Bob, E() la fonction de chiffrement et D() la fonction de déchiffrement.
et
Dans le chiffrement symétrique, on utilise la même clé secrète pour chiffrer et déchiffrer un message. Dans le chiffrement asymétrique, on utilise la clé publique du destinataire pour chiffrer et la clé privée du destinataire pour déchiffrer un message.
Ainsi, si Alice veut envoyer un message chiffré à Bob, elle chiffre le message avec la clé publique de Bob puis envoie à Bob le texte chiffré. Bob peut ensuite déchiffrer le texte avec sa propre clé privée.
Comme la clé publique de Bob est connue de tout le monde, Bob n'a aucune information sur l'identité de l'expéditeur du message chiffré. Tout le monde peut chiffrer un message avec la clé publique de Bob, et seul Bob peut le décrypter avec sa propre clé privée.
Comment faire donc pour assurer l’intégrité de l’émetteur du message ?
La signature numérique
En plus de la confidentialité, RSA permet de signer un message, c'est-à-dire d'apporter la preuve que l'expéditeur est bien la personne qu'il prétend être.
Un système de signature numérique est défini par les fonctions suivantes :
une fonction de création de signature (ms) d'un message (m) : ms = S(priA, m) ;
une fonction de vérification de la signature d'un message : V(pubA, m, ms).
Avec :
m un message ;
ms la signature du message ;
priA la clé privée de l'expéditeur (Alice) ;
pubA la clé publique de l'expéditeur (Alice).
La fonction de vérification de la signature d'un message V() prend en entrée la clé publique de l'expéditeur, le message et la signature du message. Elle renvoie "Vrai" si la signature du message correspond bien au message et à la clé publique fournis. En d'autres termes, elle renvoie "Vrai" si le message a bien été signé à l'aide de la clé privée correspondant à la clé publique fournie. Si la signature ne correspond pas, la fonction de vérification renvoie "Faux".
Avec la signature, comme Alice est la seule à connaître sa propre clé privée, seule Alice peut signer un message avec sa paire de clés publique/privée. C'est le principe de non-répudiation d'un message signé, en plus de l'authentification.
Signature d'un message
Pour signer un message, Alice envoie donc à Bob le message (éventuellement chiffré avec la clé publique de Bob) puis la signature du message. Cependant, signer directement le message a plusieurs inconvénients :
la longueur. La taille de la signature d'un message est aussi longue que le message, ce qui double donc la quantité d'informations à envoyer sur le réseau ;
la lenteur. Les fonctions de signature et de vérification ne sont pas très rapides, ce qui ralentit les performances du SI.
la traçabilité. La signature du message permet de retrouver le contenu du message. Le message n'est donc pas confidentiel.
Pour éviter ces problèmes, vous ne signez pas directement le message mais le haché du message avec une fonction de hachage cryptographique. Le haché d'un message est unique à chaque message, de taille fixe, peu importe la taille du message, et ne permet pas de retrouver le message initial. Dans la pratique, les algorithmes de signature de message implémentent le calcul du haché en interne dans les fonctions de signature et de vérification de message.
Utilisez la cryptographie hybride
La cryptographie asymétrique est beaucoup plus lente que le chiffrement cryptographie symétrique, et nécessite des clés de taille bien plus élevée. Par conséquent, vous utiliserez la cryptographie asymétrique en début de communication pour vérifier la signature de la clé publique et pour échanger une clé de chiffrement symétrique appelée clé de session. Vous utilisez ensuite la clé de session pour chiffrer les messages. C'est ce qu'on appelle la cryptographie hybride.
Pour vous donner une idée, voici un comparatif de taille de clé et de performance entre les cryptographies symétrique et asymétrique.
Taille clé symétrique | Diffie-Hellman | RSA | Courbes elliptiques (ECC) |
112 | 2 048 | 2 048 | 224 |
128 | 3 072 | 3 072 | 256 |
256 | 15 360 | 15 360 | 521 |
Performance comparée | 1 000 fois plus lent | 1 000 fois plus lent | 100 fois plus lent |
En résumé
La cryptographie asymétrique consiste à utiliser une paire de clés privée/publique ;
le chiffrement asymétrique permet de chiffrer un message avec la clé publique du destinataire, qui le déchiffre avec sa clé privée ;
la signature numérique permet de signer un message avec sa clé privée, c'est-à-dire de prouver qu'un message a été créé par la personne possédant la clé privée. C'est le principe de non-répudiation qui est plus fort que l'authentification de données avec un code MAC. Une signature est vérifiée avec la clé publique de l'expéditeur ;
on utilise généralement le chiffrement asymétrique pour échanger une clé secrète symétrique sur un canal non sécurisé avec le protocole Diffie-Hellman. On parle alors de cryptographie hybride ;
les protocoles utilisant les courbes elliptiques, plus performants, se développent de plus en plus. Ils fonctionnent de la même manière que Diffie-Hellman et RSA.