· Eric Laubacher · reviews · 11 min read
Real-world cryptography, David Wong
Real-World Cryptography est un livre écrit par David Wong, et publié par Manning en 2021.
J’ai découvert le talent de David Wong pour enseigner la cryptographie en résolvant pendant le grand confinement un challenge d’AES à 4 tours sur Root-me. En effet, David avait publié sur son blog un article sur l’attaque Square, avec des illustrations particulièrement réussies pour faciliter la compréhension du lecteur.
Dès lors, lorsque j’ai vu que David était en train d’écrire un ouvrage complet sur la cryptographie chez l’éditeur Manning, j’ai suivi avec intérêt sa rédaction.
Dès sa sortie, j’ai lu l’ouvrage en entier, comme un roman passionnant ! Récemment, je l’ai repris pour une deuxième lecture avec prise de notes. Voici quelques éléments qui m’ont particulièrement intéressés.
L’ouvrage porte sur la cryptographie moderne, et évite délibérément l’approche historique. Il désigne de façon claire les meilleures pratiques, sans perdre de temps sur le cheminement ayant conduit à celles-ci. C’est une démarche idéale pour un praticien à la recherche de la meilleure solution à son problème. Les nombreux schémas sont remarquablement didactiques, et constituent une des marques de fabrique de l’auteur. On peut noter que la version électronique est plus lisible que la version papier, grâce à l’apport de la couleur.
La première partie de l’ouvrage (les “ingrédients”) présente les primitives de base pour batir des protocoles cryptographiques :
- les fonctions de hachage
- les mécanismes de scellement (Message Authentication Code, MAC)
- le chiffrement symétrique authentifié (Authenticated Encryption with Associated Data, AEAD)
- les échanges de clés (Key Exchange)
- le chiffrement asymétrique et le chiffrement hybride
- les signatures et preuves à divulgation nulle de connaissance
- l’aléa et les secrets
Le chapitre sur les fonctions de hachage est très détaillé et instructif. Les propriétés principales attendues en cryptographie théorique sont bien expliquées :
- la résistance à la pré-image
- la résistance à la seconde pré-image
- la résistance à la collision
Sur ce point, j’ai regretté que les attaques pratiques sur les collisions MD5 n’aient pas été mentionnées, car le livre pourrait laisser penser que les attaques par collision n’ont pas de conséquences réelles.
Les attaques par extension sur les constructions de type Merkle-Dåmgard sont clairement présentées. L’ouvrage ne mentionne pas que les versions tronquées (par exemple SHA-512/256) sont résistantes, ce qui est une petite lacune. L’intérêt de SHA-3, avec sa construction de type “éponge” résistante aux attaques par extension, est bien mis en valeur.
Les mécanismes de scellement présentés sont HMAC et KMAC. Dès ce chapitre, un exemple très clair d’attaque temporelle est fourni, et illustre bien les subtilités de la cryptographie appliquée.
Concernant AEAD, l’ouvrage va droit au but et préconise AES-GCM et ChaCha20-Poly1305. C’est uniquement à la fin du chapitre que David aborde les cas particuliers où l’authentification n’est pas pertinente, comme le chiffrement de disque ou de bases de données.
Pour le chiffrement de disque, la notion de chiffrement de bloc large (wide-block cipher), aussi appelée “l’authentification du pauvre” est expliquée. L’algorithme à l’état de l’art est Adiantum, basé sur ChaCha et standardisé par Google.
Le chapitre sur l’échange de clé couvre très logiquement DH et ECDH. C’est l’occasion de présenter la théorie des groupes et les courbes elliptiques. David mentionne le site keylength, ce qui est un exemple des références externes de grande valeur qui émaillent l’ouvrage.
Les attaques par petit sous-groupe sont bien détaillées, et font prendre conscience de l’importance de prendre en compte des résultats de cryptographie théorique pour éviter les pièges.
Dans le chapitre sur le chiffrement asymétrique, David mentionne la librairie Tink de Google, avec un exemple de code Java. Le livre comporte plusieurs exemples pratiques de code dans différents langages, ce qui augmente son attrait pour un lecteur programmeur.
L’idée sous-jacente au RSA (cacher l’ordre du groupe) est présentée de façon didactique. L’histoire triste des problèmes rencontrés avec cet algorithme, notamment au travers du remplissage PKCS#1 v1.5 et des attaques récurrentes de Bleichenbacher, est particulièrement frappante. On prend alors conscience de l’inertie considérable de l’industrie à se débarrasser des constructions vulnérables. Il est ainsi surprenant de voir que le mécanisme RSA-KEM, très simple et disposant d’une preuve de sécurité, n’est pratiquement pas utilisé !
Pour les courbes elliptiques, l’ouvrage détaille le chiffrement asymétrique ECIES (Elliptic Curve Integrated Encryption Scheme). J’ai noté avec étonnement que les implémentations distinctes ne sont pas nécessairement interopérables.
Le chapitre sur la signature a été spécialement instructif pour moi. En effet, David explique le lien entre preuve à divulgation nulle de connaissance (ZKP) et la signature électronique, en montrant que celle-ci est simplement une ZKP non-interactive, le défi étant calculé à l’aide d’une empreinte cryptographique des données d’entrée (heuristique de Fiat-Shamir). Le chapitre recommande explicitement Ed25519, une bonne illustration des conseils très concrets fournis tout au long de l’ouvrage. Les attaques par substitution sont bien détaillées, ce qui incite à une saine vigilance.
Le chapitre sur les générateurs aléatoires et la gestion des secrets clôt la première partie en beauté. La difficulté à obtenir de l’aléa de qualité cryptographique est bien exposée, et la mise en garde claire. Plusieurs exemples d’attaques célèbres sont fournis, par exemple celle sur la PS3 de Sony qui réutilisait un nonce avec ECDSA. J’ai apprécié ce conseil très simple et sage : favoriser les algorithmes qui reposent moins sur les aléas, par exemple EdDSA plutôt que ECDSA.
La gestion des secrets aborde les problématiques de rotation de clés, de révocation, de rôles et de magasins de clés. On comprend bien qu’il s’agit d’un problème difficile, pour lequel il n’existe pas de solution idéale.
La deuxième partie de l’ouvrage (les “recettes”) présente les protocoles cryptographiques s’appuyant sur les mécanismes présentés dans la première partie, au travers des chapitres suivants :
- SSL et TLS
- le chiffrement de bout-en-bout
- l’authentification utilisateur
- les blockchains
- la cryptographie matérielle
- la cryptographie post-quantique
- la cryptographie du futur
- la mise en œuvre pratique
David Wong est un des contributeurs de TLS 1.3. Il présente cette nouvelle version avec grande clarté :
- l’échange de clé est soit ECDH avec P-256, P-384, P-521, X25519 ou X448, soit FFDH avec les groupes de la RFC 7919
- les signatures se font avec RSA PKCS#1.5, RSA-PSS, ECDSA, EdDSA
- la fonction de hachage pour HMAC et HKDF est soit SHA-256, soit SHA-384
- le chiffrement AEAD est soit AES-GCM 128 ou 256 , ChaCha20-Poly1305, soit AES-CCM (non décrit dans l’ouvrage)
Les mécanismes spécifiques de TLS 1.3, comme les clés pré-partagées (PSK), l’envoi d’un échange de clé spéculatif pendant la négociation, le 0-RTT sont expliqués.
La validation des certificats X.509 est jugée “le code le plus dangereux au monde”, de fait David recommande d’éviter X.509 quand cela est possible. Les problématiques de la PKI web sont bien exposés, notamment l’évolution des pratiques de gestion de la révocation, de la CRL à l’agrafage OCSP. Comme le rappelle David, la révocation est comme une ceinture de sécurité, elle sert rarement, mais elle peut sauver des vies.
L’ouvrage évoque ensuite les autres protocoles de transport sécurisé : SSH, WPA et IPSec. Puis il détaille le framework Noise, qui permet de construire un protocole adapté à chaque besoin, beaucoup plus simple et plus sûr que TLS. Pour un développement sur mesure couvrant client et serveur, voici une approche très intéressante à considérer.
Le chapitre sur le chiffrement de bout en bout aborde en premier lieu les déboires de PGP et S/Mime, et on comprend clairement que SMTP est fondamentalement conçu comme un protocole non chiffré. Les tentatives de solutions comme Saltpack sont évoquées.
L’essor des messageries instantanées sécurisées est ensuite présenté, avec une description détaillée et abondamment illustrée du protocole X3DH inventé par Signal et repris notamment par Skype et Whatsapp. Le principe de confiance à la première utilisation (TOFU) est une bonne illustration de l’aspect pragmatique de la cryptographie appliquée.
Le chapitre sur l’authentification des utilisateurs permet de prendre conscience d’un point important : en cryptographie, le défi principal n’est pas le chiffrement, mais l’authentification. L’authentification consiste à prouver qu’une chose ou une personne est bien ce qu’elle ou qui elle est sensée être. Le chapitre détaille deux types d’authentification :
- l’authentification utilisateur : comment une machine authentifie un humain
- l’authentification assistée par l’utilisateur : comment deux machines s’authentifient mutuellement avec l’aide d’un humain
La description des échanges de clés authentifiés par mot de passe (Password Authenticated Key Exchange, PAKE) est très instructive. En 2019, le forum de recherche cryptographique (CFRG) de l’IETF a recommandé deux protocoles de ce type :
- CPace pour le PAKE symétrique
- OPAQUE pour le PAKE asymétrique
La description d’OPAQUE est l’occasion de montrer l’utilité d’une fonction de génération pseudo-aléatoire à donnée cachée (OPRF). Le fonctionnement de TOTP est également très bien illustré.
Le chapitre sur les monnaies électroniques est le plus original. Il introduit la problématique des consensus byzantins (Byzantine Fault Tolerance, BFT), et fournit un lien très pertinent concernant l’algorithme Raft. Les principaux mécanismes de Bitcoin sont décrits, ainsi que le protocole DiemBFT, au cœur de la monnaie électronique Diem, à laquelle David Wong a contribué.
Le chapitre sur la cryptographie matérielle illustre particulièrement bien la différence entre la théorie et la pratique en cryptographie. On parle même de “cryptographie imparfaite”, aussi nommée la “défense en profondeur”. Quand l’attaquant a un accès physique à un système, la prévention est beaucoup plus compliquée que pour un accès à distance.
Après avoir mis en garde contre les approches de cryptographie en boite blanche, le chapitre détaille les problématiques des HSMs, TPM, TEE. Il se termine par une évocation de la cryptographie résistante aux fuites, i.e. les méthodes cryptographiques permettant de lutter contre les attaques par canaux cachés. Le fait que des attaques par faute puissent être menées par logiciel (voir V0LTpwd / Plundervolt) est assez cocasse, et illustre l’ampleur du défi de la cryptographie en environnement fortement hostile.
Le chapitre suivant traite de la cryptographie post-quantique. Ici pas de description détaillée de l’informatique quantique, mais plutôt celle des algorithmes permettant de résister aux algorithmes de Shor (permettant de casser RSA, DH et les courbes elliptiques). Concernant l’algorithme de Grover, capable de virtuellement diviser par deux la longueur des clés symétriques, le doublement de la longueur des empreintes cryptographiques (512 au lieu de 256) et des clés AES (256 au lieu de 128) est suffisant.
David fournit une information amusante : il est possible d’augmenter la taille des clés RSA pour résister aux ordinateurs quantiques. Mais il faudrait une clé de 1 To ;-)
Les algorithmes post-quantiques présentés sont :
- les signatures basées sur des empreintes cryptographiques, faciles à comprendre grâce aux schémas didactiques, très sures, mais avec des clés assez longues
- les algorithmes basés sur des réseaux euclidiens, en particulier Kyber et Dilithium, qui sont des candidats très sérieux à la compétition lancée par le NIST et qui doit aboutir en 2022
Faut-il commencer à paniquer ? L’ouvrage rapporte quelques prédictions de spécialistes, la plus alarmante d’une attaque sur RSA-2048 d’ici 5 ans avec une probabilité de 1/7, jusqu’à l’impossibilité d’aboutir à un ordinateur quantique réellement utile. Le principe de double signature (par exemple Ed25519 et Dilithium) a déjà été mis en œuvre.
Le chapitre sur la cryptographie du futur est celui qui est le plus difficile à aborder, et l’auteur recommande de le passer rapidement puis d’y revenir plus tard. Il aborde les calculs multipartites sécurisés (MPC), avec plusieurs problèmes bien connus :
- le problème des millionnaires, qui veulent comparer leur richesse sans la divulguer
- le problème de l’intersection d’ensembles sans divulgation (PSI), pour lequel Signal a opté pour un logiciel tierce-partie dans une enclave SGX
L’ouvrage détaille un algorithme PSI basé sur des générateurs OPRF, dont le principe a été retenu par Google pour vérifier les mots de passe faible dans Chrome sans les transmettre.
Le chapitre se poursuit avec le chiffrement homomorphe (Fully Homomorphic Encryption, FHE), très bien décrit et dont on comprend les progrès considérables ces dernières années. La standardisation est en route, se reporter à https://homomorphicencryption.org. On notera que RSA n’est que partiellement homomorphique (uniquement pour la multiplication), FHE impliquant l’homomorphisme pour la multiplication et l’addition. Le premier algorithme FHE, bootstrap, a été inventé par 2009 par Craig Gentry.
La partie la plus ardue concerne zk-SNARK (zero-knowledge Succint Non-Interactive Argument of Knowledge), une méthode de preuve efficace de connaissance popularisée par les blockchains, et dont l’ouvrage présente les grandes lignes.
Le dernier chapitre fournit des conseils pratiques :
- la complexité est l’ennemi de la sécurité
- rester simple, même si cela mène à une cryptographie ennuyeuse
- pour un cours complet, voir https://cryptobook.us, ou l’ouvrage “Serious Cryptography” de Jean-Philippe Aumasson
- favoriser la cryptographie “polie”, qui laisse peu de place à une mauvaise utilisation
- utiliser des librairies éprouvées, comme Tink, libsodium, cryptography.io, ou la librairie standard de Golang
- utiliser des vérifications formelles, avec Tamarin ou Verifpal par exemple
- étudier les pièges du passé avec les challenges sur cryptopals.com ou cryptohack.org
- et surtout éviter d’inventer votre propre algorithme
Ce chapitre mentionne l’outil Wycheproof de Google, qui a permis de débusquer un nombre impressionnant de bugs dans des implémentations cryptographiques. Mais si 17% des problèmes viennent des librairies, 83% viennent de leur mauvaise mise en œuvre.
Il est donc aisé de recommander la lecture de “Real-World Cryptography” aux programmeurs et membres d’équipes de sécurité des systèmes d’information. Mais toute personne curieuse de mieux comprendre cette étrange discipline qu’est la cryptographie trouvera également un grand bénéfice à sa lecture, tant David Wong fait preuve d’un formidable talent pour éclairer et illustrer des concepts souvent difficiles.