Cryptographie : à quoi servent les nombres aléatoires ?

La cryptographie moderne est (entre autres) basée sur la génération de nombres aléatoires. Christoph Scholz/flickr, CC BY-SA

Hervé Debar, Télécom SudParis – Institut Mines-Télécom et Olivier Levillain, Télécom SudParis – Institut Mines-Télécom

À l’origine, la cryptographie a pour but de permettre à deux intervenants (traditionnellement dénommés Alice et Bob) d’échanger des messages sans qu’un autre intervenant (traditionnellement appelé Ève) puisse en prendre connaissance. Alice et Bob vont donc se mettre d’accord sur une méthode pour échanger chaque message M sous une forme chiffrée C. Ève peut observer le médium par lequel transitent les chiffrés C, et prendre connaissance de chacun d’entre eux, mais elle ne peut pas retrouver les informations échangées sans la connaissance du secret adéquat, qu’on appelle généralement clé.

C’est un exercice très ancien, puisque l’on parle par exemple du « chiffre de Jules César ». Il a cependant pris une très grande importance ces dernières années, en raison de la nécessité croissante d’échanger des informations. La cryptographie est ainsi devenue un élément essentiel de notre vie quotidienne. Au-delà de l’échange de messages, les mécanismes cryptographiques sont utilisés dans de nombreux objets du quotidien, pour identifier et authentifier les utilisateurs et leurs transactions. On trouve ces mécanismes dans les téléphones, pour chiffrer et authentifier les communications entre le téléphone et les antennes radio, ou encore dans les clés de voiture, les cartes bancaires, etc.

Internet a aussi popularisé le cadenas dans les navigateurs, pour indiquer que les communications entre le navigateur et le serveur sont protégées par des mécanismes cryptographiques. Pour fonctionner correctement, ces mécanismes nécessitent d’utiliser des nombres aléatoires, dont la qualité (plus précisément leur non-prédictibilité) participe à la sécurité des protocoles.

Les algorithmes cryptographiques

Pour transformer un message M en chiffré C par le biais d’un algorithme A, on utilise des clés. Dans les algorithmes dits symétriques, on parle de clés secrètes (Ks), qui sont partagées et gardées secrètes par Alice et Bob. Dans le cadre d’algorithmes asymétriques, on trouve des paires de clés publiques (KPu) et privées (KPr). Pour chaque utilisateur, KPu est connue de tous, alors que KPr doit être conservée précieusement par son possesseur. L’algorithme A est également public, ce qui signifie que le secret de la communication repose uniquement sur le secret des clés (secrètes ou privées).

Parfois, le message M transmis n’est pas important en soi, et le chiffrement d’un message M donné a pour but de vérifier que son correspondant peut le déchiffrer. Cette preuve de la possession de Ks ou KPr peut servir dans certains schémas d’authentification. Dans ce cas, il est important de ne jamais utiliser plusieurs fois le même message M, puisque cela permettrait à Ève de connaître des informations relatives aux clés. Il est donc nécessaire de générer un message aléatoire NA, qui changera à chaque fois qu’Alice et Bob voudront entrer en communication.

L’exemple le plus connu et vraisemblablement le plus utilisé de ce mécanisme est l’algorithme de Diffie-Helman. Cet algorithme permet à un navigateur (Alice) et un site web (Bob) d’obtenir une clé secrète Ks identique, différente à chaque connexion, en ayant échangé leurs KPu respectifs au préalable. Ce processus s’exécute par exemple lors d’une connexion à un site marchand. Cela permet au navigateur et au site web d’échanger des messages chiffrés avec une clé qui sera détruite à la fin de chaque session. Cela signifie qu’on n’a pas besoin de la conserver (simplicité d’utilisation, sécurité car il y a moins de chance de perdre cette clé). Cela implique aussi qu’on ne chiffrera pas beaucoup de trafic avec une même clé, ce qui rend les attaques par cryptanalyse plus difficiles que si on utilise toujours la même clé.

La génération des nombres aléatoires

Pour qu’Ève ne puisse pas obtenir la clé secrète, il est très important qu’elle ne puisse pas deviner le message NA. En pratique, ce message est souvent un grand nombre aléatoire utilisé dans les calculs définis par l’algorithme choisi.

Initialement, la génération d’aléa a été utilisée pour de nombreux travaux de simulation. Pour obtenir des résultats pertinents, il est important de ne pas répéter la simulation avec toujours les mêmes paramètres, mais de répéter la simulation avec des paramètres différents, et ce des centaines voire des milliers de fois. On cherche alors à générer des nombres qui respectent certaines propriétés statistiques et qui ne permettent pas de différencier la suite de nombres d’une suite qui serait obtenue par des tirages de dés, par exemple.

Pour générer un nombre aléatoire NA utilisable dans ces simulations, on utilise généralement des générateurs dits pseudo-aléatoires, qui appliquent un algorithme de retraitement à une valeur initiale, dénommée « semence ». Ces générateurs pseudo-aléatoires ont pour but de produire une suite de nombres qui ressemble à une suite aléatoire, d’après ces critères statistiques. Cependant, en utilisant deux fois la même semence, on obtient deux fois la même suite.

L’algorithme du générateur pseudo-aléatoire est généralement public. Si un attaquant est capable de deviner la semence, il est capable de générer la séquence aléatoire, et donc d’obtenir les nombres aléatoires utilisés par les algorithmes cryptographiques. Dans le cas précis de la cryptographie, l’attaquant n’a même pas nécessairement besoin de connaître exactement la valeur de la semence. S’il est capable de deviner un ensemble de valeurs, cela suffit pour calculer rapidement toutes les clés possibles et casser le chiffrement.

Dans les années 2000, les programmeurs ont utilisé des semences qui pouvaient être facilement devinées, basées sur le temps par exemple, rendant les systèmes vulnérables. Depuis, pour éviter cette capacité à deviner la semence (ou un ensemble de valeurs de cette semence), les systèmes d’exploitation se basent sur un mélange d’éléments physiques du système (température du processeur, connexions sur le bus, etc.). Ces éléments physiques sont impossibles à observer pour un attaquant, varient fréquemment, et donc forment une bonne source de semence pour les générateurs pseudo-aléatoires.

Quid des vulnérabilités ?

Bien que le domaine soit aujourd’hui bien compris, les générateurs de nombres aléatoires font encore parfois l’objet de vulnérabilités. Ainsi, entre 2017 et 2021, les chercheurs en cybersécurité ont trouvé 53 failles de ce type (CWE-338). Cela ne représente qu’un petit nombre des failles logicielles (moins de 1 pour 1 000). Plusieurs de ces failles sont cependant de niveau élevé ou critique, indiquant qu’elles peuvent être assez facilement utilisées par des attaquants, et qu’elles sont largement répandues.

Un exemple emblématique en 2010 est l’erreur de Sony sur le système de signature des logiciels de la PS3. Dans ce cas, la réutilisation d’un aléa pour deux signatures distinctes a permis à un attaquant de retrouver la clé privée du fabricant : il devient alors possible d’installer n’importe quel logiciel sur la console, y compris des logiciels piratés ou des malwares.

Sur la période 2017-2021, des failles ont également touché des composants physiques : les processeurs Intel Xeon, les puces Broadcom utilisées pour les communications, et les processeurs Qualcom SnapDragon embarqués notamment dans les téléphones portables. Ces failles affectent la qualité de la génération des nombres aléatoires. Par exemple, CVE-2018-5871 et CVE-2018-11290 concernent un générateur de semence dont la périodicité est trop courte, c’est-à-dire qui répète la même suite de semences rapidement. Ces failles ont été corrigées et elles ne touchent que certaines fonctions du matériel, ce qui limite le risque.

La qualité de la génération des nombres aléatoires est donc effectivement un problème de sécurité. Les systèmes d’exploitation s’exécutant sur des processeurs récents (moins de 10 ans) disposent de mécanismes de génération de nombres aléatoires basés sur le matériel. Cela permet en général d’assurer une bonne qualité de ceux-ci et donc un bon fonctionnement des algorithmes cryptographiques, même si des vulnérabilités ponctuelles peuvent survenir. En revanche, la difficulté est spécialement marquée du côté des objets connectés, dont les capacités matérielles ne permettent pas d’implémenter des générateurs aléatoires aussi performants que ceux disponibles sur ordinateurs et smartphones, et qui s’avèrent souvent plus vulnérables.

Hervé Debar, Directeur de la Recherche et des Formations Doctorales, Directeur adjoint, Télécom SudParis – Institut Mines-Télécom et Olivier Levillain, Maître de conférences, Télécom SudParis – Institut Mines-Télécom

Cet article est republié à partir de The Conversation sous licence Creative Commons. Lire l’article original.

Un commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.