• 8 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 28/11/2019

Utilisez le chiffrement symétrique pour protéger vos informations

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans ce chapitre, vous allez découvrir en détail les deux types de briques de base de chiffrement symétrique : le chiffrement de flux (ou encore appelé chiffrement parflot) et le chiffrement par bloc. Je vous propose dans un premier temps de comprendre les spécificités de chacun, pour ensuite voir ensemble lequel utiliser pour quel usage. Vous êtes prêt ?

Initiez-vous au chiffrement de flux

Le chiffrement de flux est basé sur le principe du One-Time Pad, c'est-à-dire l'opération bit à bit XOR (que vous avez étudiée au chapitre 1 ; si vous avez oublié, c'est par ici).

À la différence du One-Time Pad, le chiffrement de flux utilise une clé secrète de taille fixe, qui peut être plus petite que le message en clair. Vous utilisez un GNPA déterministe (si vous avez besoin de vous rafraîchir la mémoire, on en a parlé au chapitre précédent) pour transformer cette clé secrète en un nombre pseudo-aléatoire aussi long que le message, appelé flux de clé. Vous pouvez ensuite effectuer l'opération bit à bit XOR entre le message en clair et le flux de clé pour obtenir le texte chiffré.

Pour déchiffrer le texte chiffré, vous utilisez le même GNPA déterministe avec en entrée la même clé secrète pour obtenir le même flux de clé. Vous pouvez effectuer la même opération bit à bit XOR entre le texte chiffré et le flux de clé pour obtenir le message en clair.

Ainsi, la clé secrète à partager entre l'expéditeur et le destinataire du message reste de taille limitée par rapport à la longueur du message.

Attaques sur le chiffrement de flux

À la différence du One-Time Pad, le chiffrement de flux n'est pas incassable.

En effet, un attaquant peut faire une recherche exhaustive en essayant toutes les clés possibles. Comme la clé est plus petite que le message, seule la tentative avec la bonne clé donnera un résultat qui a du sens, tous les autres essais donneront une suite de caractères aléatoires qui n'ont pas de sens. L'attaquant pourra donc deviner quelle clé est la bonne.

Cependant, avec une clé suffisamment grande, il faudrait des ressources illimitées à l'attaquant pour essayer toutes les clés, ce qui est physiquement impossible. On dit donc que ce chiffrement a une sécurité calculatoire, par opposition à la sécurité inconditionnelle du One-Time Pad. C'est aussi vrai pour tous les autres systèmes cryptographiques.

Comme avec le One-Time Pad, vous ne pouvez pas utiliser deux fois la même clé pour chiffrer deux messages différents, car cela détruirait la confidentialité des deux textes chiffrés.

Prenons 2 messages chiffrés avec la même clé :

c1 = m1 XOR GNPA(k)

c2 = m2 XOR GNPA(k)

Un attaquant qui intercepte les deux textes chiffrés c1 et c2 peut calculer :

c1 XOR c2 = m1 XOR GNPA(k) XOR m2 XOR GNPA(k) = m1 XOR m2

car x XOR x = 0 et x XOR 0 = x pour tout x

Or, m1 XOR m2 est vulnérable à une attaque fréquentielle, ce qui permet à l'attaquant de facilement retrouver le contenu des messages m1 et m2.

Pour envoyer plusieurs messages avec la même clé, il faut utiliser une méthode pour modifier la clé à chaque fois. Une façon de faire est d'utiliser un autre GNPA pour générer une suite de pseudo-clés à partir de la clé initiale. Pour chaque message, on utilise une des pseudo-clés pour chiffrer le message avec le chiffrement de flux, puis on utilise la pseudo-clé suivante pour chiffrer le message suivant. Ainsi, on n'utilise jamais deux fois la même pseudo-clé pour chiffrer deux messages.

Une autre méthode est d'utiliser un compteur avec la clé. Si la clé est "topsecret", par exemple, on utilise la clé "topsecret001" pour chiffrer le premier message, puis la clé "topsecret002" pour chiffrer le deuxième message, etc.

Bien que le chiffrement de flux soit souvent la solution de chiffrement la plus rapide, elle est aujourd'hui généralement remplacée par la méthode de chiffrement par bloc. Cependant, des algorithmes de chiffrement par flot sécurisés sont parfois utilisés pour les protocoles HTTPS, OpenSSH ou encore pour générer des nombres pseudo-aléatoires.

Par ailleurs, des protocoles de chiffrement de flux non sécurisés se retrouvent encore fréquemment dans des solutions logicielles et matérielles. Dans ce cas, la sécurité de ces produits est compromise, et il vous faudra les changer.

Le chiffrement par bloc

C’est la deuxième catégorie de chiffrement symétrique, et la plus utilisée aujourd'hui. Le chiffrement par bloc consiste à découper un message en blocs de taille fixe, généralement de 128 bits. Chaque bloc est chiffré avec la clé secrète et une fonction de chiffrement de bloc interne, ce qui donne un bloc chiffré de la même taille. On regroupe ensuite tous les blocs pour former le texte chiffré.

Choisissez le mode de chiffrement par bloc adapté

Il existe différents modes de chiffrement pour chiffrer par bloc. Je vous propose ici d’en voir trois principaux : le chiffrement ECB, le chiffrement CBC et le chiffrement CTR.

Le chiffrement ECB (Electronic Code Book)

Dans le mode de chiffrement par bloc le plus simple, appelé ECB, vous réalisez le chiffrement de chaque bloc séparément et rassemblez tous les blocs en sortie pour former le texte chiffré.

Mode de chiffrement ECB
Mode de chiffrement ECB

Le mode ECB comporte cependant un défaut de taille : tous les blocs en clair identiques vont donner le même bloc chiffré. Cela est particulièrement visible pour une image. Tous les pixels sont chiffrés, mais chaque pixel identique donnera le même pixel chiffré, et le motif de l'image est toujours visible dans le texte chiffré.

Différences de chiffrement
Les blocs identiques ont le même résultat chiffré avec EBC

Pour éviter cela, il existe d'autres modes de chiffrement qui permettent qu'un bloc en clair identique à un autre, chiffré avec la même clé, produise un bloc chiffré différent à chaque fois. On dit que le chiffrement est non déterministe.

Le mode CBC (Cipher Block Chaining)

Ce mode consiste à effectuer l'opération XOR entre le bloc clair actuel et le bloc chiffré précédent, avant de chiffrer le bloc actuel. Pour le premier bloc, il n'y a pas de bloc précédent. On effectue l'opération XOR avec une variable aléatoire appelée vecteur d'initialisation (IV), et on transmet l'IV en clair avec le texte chiffré. 

Le chiffrement en mode CBC
Le chiffrement en mode CBC

L'IV ne doit jamais être réutilisé avec la même clé. Voici pourquoi :

Alice envoie un message à Bob. Elle chiffre le message en mode CBC, mais utilise toujours le même IV. Le message en clair est composé de 2 blocs : m1 est "Message à Bob" et m2 est "oui".

L'attaquant, appelons-le Charlie, intercepte le texte chiffré composé de 2 blocs c1 et c2, et de l'IV.

Imaginez que Charlie puisse envoyer un message en clair à Alice et recevoir le texte chiffré correspondant.

Charlie se doute que m1 commence par "message à", car il s'agit d'un protocole standard, mais il ne sait pas à qui est destiné le message. Il envoie à Alice "message à Zoé" et reçoit le texte chiffré correspondant c'1. c'1 est différent de c1, ce qui signifie que le message n'est pas pour Zoé.

Pris d'inspiration, Charlie envoie "message à Bob" à Alice et reçoit le texte chiffré correspondant c''1. c''1 est égal à c1, donc Charlie sait maintenant que le message initial commençait bien par "message à Bob".

De même, il peut maintenant envoyer à Alice "Message à Bob oui" et il recevra c'''1 et c'''2 avec c'''2 qui est égal à c2. Il connaît donc la totalité du message intercepté.

L'IV doit également être imprévisible pour la même raison, même s'il est ensuite envoyé en clair avec le texte chiffré. En effet, reprenons le scénario précédent, mais cette fois avec un IV prévisible (par exemple un compteur). Charlie a intercepté c1 et IV1 et il veut vérifier que m1 est "Message à Bob". Charlie connaît à l'avance IV2, l'IV qui sera utilisé pour chiffrer le message qu'il va envoyer à Alice.

Cette fois, au lieu d'envoyer directement "Message à Bob" il envoie m1 XOR IV1 XOR IV2.

Il reçoit en retour c'1 qui est égal à E(k, m1 XOR IV1 XOR IV2 XOR IV2) = E(k, m1 XOR IV1) = c1.

Il a donc la confirmation que m1 est bien "Message à Bob" et peut continuer l'attaque avec m2.

Le mode CTR (CounTeR)

 Ce mode imite le fonctionnement d'un chiffrement de flux, en utilisant un compteur qui s'incrémente à chaque bloc. Le compteur et la clé sont chiffrés avec la fonction de chiffrement de bloc, ce qui donne un flux pseudo-aléatoire découpé en blocs. Vous effectuez ensuite l'opération XOR entre le bloc du flux pseudo-aléatoire et le bloc en clair, ce qui donne le bloc chiffré.

Le chiffrement en mode CTR
Le chiffrement en mode CTR

Ce mode permet d'effectuer le chiffrement de manière parallèle, c'est-à-dire de chiffrer simultanément plusieurs blocs sur plusieurs processeurs pour accélérer le chiffrement d'un message. De même, le déchiffrement peut être fait de manière parallèle. La seule contrainte de ce mode est que le compteur ne doit jamais être réutilisé, car cela détruirait la confidentialité de la même manière que pour un chiffrement de flux.

Il existe d'autres modes de chiffrement comme GCM (Galois Counter Mode), basé sur CTR et très rapide d'exécution.

Quel algorithme de chiffrement utiliser ?

Le chiffrement de bloc, avec l'algorithme AES, est la solution qui s'adapte à presque toutes les situations, notamment parce que la majorité des processeurs ont des instructions optimisées pour AES. Il est en général utilisé avec les modes CTR et GCM, qui offrent les meilleures performances.

Le chiffrement de disque dur est un cas particulier où on chiffre fréquemment les mêmes fichiers et donc les mêmes messages ; le mode CBC et sa variante XTS sont les plus adaptés.

Le chiffrement de flux est très rapide. Il est adapté lorsqu'un équipement n'est pas optimisé pour AES, comme cela peut arriver dans les objets connectés ou embarqués, ou encore sur certains smartphones. L'algorithme le plus populaire actuellement est Salsa20, ainsi que ses variantes, comme Chacha.

Voici un bref comparatif des différents algorithmes de chiffrement symétrique :

Type de chiffrement

Algorithme

Taille de clé

Vitesse sans matériel

Vitesse avec matériel

Avantages 

Défauts

Usage

Bloc

AES-GCM

128-192-256

  ~ 100 Mo/s*(incluant intégrité)

  ~ 2 000 Mo/s*
(incluant intégrité)

  Rapide et parallélisable

Chiffrement authentifié (AEAD)

Pas de padding

  Ne pas réutiliser un compteur

  Mode de chiffrement par défaut
Réseau, fichier, messagerie…

 

 AES-CBC

  128-192-256 

 ~ 120 Mo/s

  ~ 2 700 Mo/s 

 Déchiffrement parallélisable

Propagation d'erreur (pour MAC)

  Chiffrement non parallélisable
IV unique et imprédictible
Padding nécessaire

  Chiffrement complet de disque
Création de code MAC

 

 AES-CTR

128-192-256 

  ~ 150 Mo/s 

 ~ 3 000 Mo/s 

 Rapide et parallélisable
Pas de padding

 Pas d'intégrité
Pas réutiliser un compteur

   Alternative à GCM sans intégrité

 Flux

 Salsa20 ou
ChaCha

   128-256

  ~ 700 Mo/s 

 ~ 700 Mo/s

 Très rapide sans support matériel
Pas de padding 

 Ne pas réutiliser un nonce

Malléable

 Si pas d'accélération matérielle AES
Communications mobiles, objets connectés

Définissez la taille de la clé

La taille de la clé est cruciale pour la sécurité du chiffrement, même si ce n'est pas le seul paramètre. Comme vous l'avez vu, tous les algorithmes de chiffrement sont vulnérables aux attaques par force brute (appelées également attaques par recherche exhaustive), sauf le One-Time Pad. Cette attaque consiste à essayer toutes les clés de chiffrement possibles jusqu'à trouver celle qui déchiffre correctement le texte chiffré.

Pour résister à une attaque par force brute, le chiffrement doit avoir un nombre de combinaisons de clé supérieur à ce qu'un attaquant peut calculer dans la pratique. Le nombre de combinaisons de clé est directement lié à la taille de la clé. Plus précisément, pour une clé de n bits, il y a $\(2^n \)$ combinaisons ou valeurs de clé possibles.

Avant de calculer la taille de la clé, faisons une petite expérience :

Prenez une feuille de papier A4 standard et pliez-la en 2. Puis, sans la déplier, pliez-la encore en 2. Renouveler l'opération pour la plier 42 fois au total. Quelle est l'épaisseur de la feuille ? Intuitivement, nous pensons que l'épaisseur est inférieure à 1 mètre. En réalité, l'épaisseur est de plus de 400 000 km, soit plus que la distance de la Terre à la Lune ! :)

En effet, c'est une opération exponentielle. La feuille a une épaisseur initiale de 0.1 mm, et une épaisseur finale de 0.1 x2^42 = 4 x 10^11 mm, soit 4 x 10^5 km ou 400 000 km.

Cette expérience montre que nous avons du mal à estimer les grandeurs exponentielles.

Pour évaluer le nombre d'opérations qu'un attaquant peut calculer, on se base sur la performance actuelle des processeurs, et on choisit un nombre d'opérations largement supérieur à ce qu'un attaquant pourrait réaliser avec des ressources et en un temps raisonnable. On prend également en compte l'évolution future des processeurs et la loi de Moore. On choisit ensuite un nombre qui est bien au-delà de ce que l'on pourra calculer.

Lorsque la performance de l'application n'est pas un facteur limitant, il est possible d'utiliser des clés de 256 bits (2^256 combinaisons, ou 1 suivi de 77 zéros) pour pallier à une faille encore inconnue qui diminuerait la sécurité du système de chiffrement. En particulier, avec un ordinateur quantique, il serait possible de faire une attaque sur le chiffrement qui diviserait la sécurité d'un chiffrement par sa racine carrée. Une clé de 128 bits aurait alors une sécurité de 2^128/2 = 2^64. Cela rendrait une attaque brute force possible. C'est pourquoi, pour des applications particulièrement sensibles, lorsque les données doivent rester confidentielles pour une durée de plusieurs année,s voire dizaines d'années, il est conseillé d'utiliser une clé de 256 bits. Ainsi, même avec un ordinateur quantique, la sécurité serait de 2^256/2 = 2^128 et une attaque par force brute serait toujours impossible.

Rassurez-vous, les ordinateurs quantiques ne sont pour le moment qu'une hypothèse, et il est peu probable que l'on soit capable d'en créer un suffisamment stable et puissant avant au minimum 10 ans (pour les plus optimistes). ^^

Par exemple, le chiffrement 3DES utilise une clé de 168 bits, mais une attaque appelée "meet in the middle" permet de décrypter un message en 2^112 opérations. Cet algorithme a donc une sécurité de 112 bits.

En résumé

  • Le chiffrement symétrique permet d'échanger un message de manière confidentielle entre 2 parties qui partagent une clé secrète ;

  • le chiffrement par flux est rapide, mais la clé ou le compteur ne doivent jamais jamais être réutilisés ;

  • le chiffrement par bloc est le plus populaire, notamment AES en mode CTR ou GCM ;

  • le chiffrement de flux offre de meilleures performances sur les objets connectés ou mobiles, notamment Salsa20/Chacha.

Exemple de certificat de réussite
Exemple de certificat de réussite