C5 — MigrationDans le dialogue d’impression, choisissez « Enregistrer au format PDF » comme destination.
Retour

Master 1 · Cryptographie post-quantique

Cours 5Migration

Hybrider, déployer, inventorier : passer du schéma normalisé au système qui tourne.

2 chapitres · 8 h de travail estimé

  1. 1. Hybridation et déploiement4 h
  2. 2. Agilité cryptographique et gouvernance4 h

Chapitre 1 · 4 h

Hybridation et déploiement

Combinateurs hybrides X25519 + ML-KEM, intégration TLS 1.3 et SSH, taille des handshakes et fragmentation, certificats post-quantiques.

Nous avons douze chapitres de théorie et de schémas. Reste à les mettre dans des protocoles qui existent déjà, tournent sur des équipements qu'on ne contrôle pas, et ne doivent pas cesser de fonctionner pendant l'opération. C'est un problème d'ingénierie, et il a ses propres pièges.

Le combinateur hybride

L'hybridation consiste à exécuter simultanément un mécanisme classique et un mécanisme post-quantique, puis à combiner les deux secrets obtenus. La propriété visée est explicite : la construction reste sûre tant qu'au moins l'un des deux tient.

La justification n'est pas théorique, elle est empirique — c'est le chapitre 10. Un déploiement hybride X25519 + SIKE n'a rien perdu le 30 juillet 2022. Un déploiement SIKE seul était nu du jour au lendemain.

Le combinateur retenu par TLS 1.3 est la concaténation des deux secrets, injectée dans la dérivation de clés :

secret=KDF(ssPQssclassiquetranscript)\mathit{secret} = \mathrm{KDF}\big( ss_{\mathrm{PQ}} \,\|\, ss_{\mathrm{classique}} \,\|\, \mathit{transcript} \big)

Pourquoi concaténer plutôt que faire un OU exclusif ? Le XOR est sûr si l'un des deux secrets est uniformément aléatoire, mais il ne l'est plus si un attaquant peut corréler les deux — ce qui n'est pas exclu quand les deux mécanismes partagent le même aléa ou le même générateur. La concaténation suivie d'un haché ne fait aucune hypothèse d'indépendance.

Un détail qui compte, et qui a été appris à la dure sur d'autres protocoles : le transcript doit entrer dans la dérivation. Sans lui, un attaquant peut parfois substituer un chiffré à un autre sans que la clé change. Les combinateurs modernes lient explicitement les chiffrés et les clés publiques à la clé dérivée.

Quiz · 1 question

Pourquoi concaténer les deux secrets plutôt que les combiner par OU exclusif ?

  • Parce que le XOR est plus lent
  • Parce que le XOR n'est sûr que si les deux secrets sont indépendants, hypothèse qu'on ne veut pas faire
  • Parce que les deux secrets n'ont pas la même longueur

Réponse : Le XOR de deux valeurs est uniforme dès que l'une l'est ET qu'elles sont indépendantes. Or les deux mécanismes peuvent partager un générateur d'aléa ou être corrélés d'une manière qu'on n'anticipe pas. La concaténation suivie d'un haché ne fait aucune hypothèse d'indépendance : elle reste sûre tant que l'un des deux secrets est imprévisible, quelle que soit sa relation avec l'autre.

X25519MLKEM768 dans TLS 1.3

Le déploiement s'est fait sans changer TLS. Le groupe hybride est enregistré comme un groupe supplémentaire dans la négociation existante : le client propose une part de clé qui est la concaténation de la clé d'encapsulation ML-KEM-768 et de la clé publique X25519. Le serveur répond avec le chiffré ML-KEM et sa part X25519.

part clientpart serveur
X25519 seul32 o32 o
ML-KEM-768 seul1184 o1088 o
X25519MLKEM7681216 o1120 o

L'élégance de la solution est qu'elle ne demande aucune modification du protocole : un serveur qui ne connaît pas le groupe hybride l'ignore et retombe sur X25519. La migration peut donc se faire côté client sans coordination.

Le déploiement est réel et massif : les principaux navigateurs l'activent par défaut, et une part importante du trafic web est aujourd'hui protégée par un échange de clés hybride. C'est le point le plus encourageant du cours — la partie difficile a déjà commencé, et elle marche.

La fragmentation, seul incident notable

Un ClientHello classique fait quelques centaines d'octets et tient dans un paquet. Avec une part de clé de 1216 octets, il dépasse la MTU et se répartit sur deux segments TCP.

En théorie, c'est sans conséquence. En pratique, certains équipements intermédiaires — pare-feux, inspecteurs de trafic, terminaisons TLS anciennes — supposaient qu'un ClientHello tenait dans un seul segment. Ces implémentations ont échoué, et ces échecs ont constitué l'essentiel des incidents de la migration.

C'est une leçon d'ingénierie qui dépasse la cryptographie : une hypothèse implicite jamais énoncée finit toujours par être violée. Personne n'avait écrit que le ClientHello tenait dans un paquet ; tout le monde en dépendait.

Les certificats, le vrai problème

L'échange de clés est le cas facile. Les certificats sont le mur.

Une chaîne TLS transporte, pour chaque certificat, une clé publique et la signature de son émetteur, plus un CertificateVerify final. Le passage à ML-DSA-44 fait passer chaque certificat d'environ 500 octets à près de 4 kilooctets.

Graphique

Taille totale d'un handshake TLS 1.3, en octets

  • classique : 16341634
  • hybride, certs EC : 39063906
  • Falcon-512 : 63986398
  • ML-DSA-44 : 1347013470
  • SLH-DSA-128s : 2854228542
L'hybridation de l'échange de clés double le handshake — c'est absorbable. Passer les certificats en ML-DSA le multiplie par huit et déborde la fenêtre de congestion initiale, ce qui coûte un aller-retour supplémentaire à chaque connexion.

La fenêtre de congestion initiale vaut typiquement dix segments, soit environ 14 kilooctets. Un handshake classique en consomme un huitième ; un handshake entièrement post-quantique la sature ou la dépasse, ce qui ajoute un aller-retour — donc de la latence perceptible à chaque connexion.

Plusieurs pistes sont explorées pour comprimer les chaînes : supprimer les certificats intermédiaires que le client possède déjà, négocier les ancres de confiance, ou remplacer la chaîne par une preuve d'appartenance à un arbre de Merkle — l'idée du chapitre 9, appliquée à la PKI.

En attendant, la recommandation opérationnelle est claire, et elle découle du chapitre 1 :

  • l'échange de clés est urgent — récolte anticipée — et peu coûteux : migrez-le maintenant, en hybride ;
  • les certificats sont moins urgents — une signature vérifiée aujourd'hui ne craint pas une machine future — et bien plus chers : attendez que les solutions de compression mûrissent.

Cette dissociation est la décision d'architecture la plus importante du bloc.

Quiz · 1 question

Faut-il migrer les certificats TLS en même temps que l'échange de clés ?

  • Oui, sinon la chaîne est le maillon faible
  • Non : l'échange de clés est urgent et peu coûteux, les certificats sont moins urgents et bien plus chers
  • Non, les certificats ne sont pas concernés par la menace quantique

Réponse : Les certificats sont bien concernés — un attaquant quantique pourrait forger une signature ECDSA et usurper un serveur. Mais cette attaque exige la machine AU MOMENT de la connexion, alors que la récolte anticipée menace la confidentialité dès aujourd'hui. La chaîne n'est donc pas le maillon faible dans le temps, et comme elle coûte huit fois plus cher en octets, la dissocier est le bon arbitrage.

SSH et le reste

SSH a migré avant TLS, et sans hybridation débattue : OpenSSH a adopté un échange hybride par défaut dès 2022, d'abord avec un mécanisme à réseaux non normalisé, puis avec ML-KEM une fois la FIPS 203 publiée. Le contexte s'y prêtait — un client et un serveur, peu d'équipements intermédiaires, des mises à jour fréquentes.

Les autres chantiers avancent plus lentement, et pour des raisons instructives. IKEv2 et IPsec souffrent de la fragmentation UDP. Les protocoles de messagerie doivent gérer des clés pré-publiées à long terme. Les objets connectés n'ont ni la mémoire ni la bande passante, et leur cycle de remplacement se compte en décennies — c'est là que l'inégalité de Mosca est la plus défavorable.

À vous

Exercice de code

Complétez le coût de la chaîne de certificats, puis identifiez ce qui coûte vraiment — ce n'est pas l'échange de clés.

Point de départ

// Combien d'octets coûte un handshake TLS 1.3 selon ce qu'on y met ?
// Modèle simplifié mais aux bons ordres de grandeur.

const MTU = 1500;          // trame Ethernet
const SEGMENT = 1400;      // charge utile TCP typique
const INITCWND = 10;       // fenêtre de congestion initiale, en segments

const ECHANGE = {
  "X25519":            { client: 32,   serveur: 32 },
  "ML-KEM-768":        { client: 1184, serveur: 1088 },
  "X25519MLKEM768":    { client: 1216, serveur: 1120 },
};

const SIGNATURE = {
  "ECDSA P-256": { pk: 64,   sig: 64 },
  "Ed25519":     { pk: 32,   sig: 64 },
  "ML-DSA-44":   { pk: 1312, sig: 2420 },
  "Falcon-512":  { pk: 897,  sig: 666 },
  "SLH-DSA-128s":{ pk: 32,   sig: 7856 },
};

const ENTETE_CERT = 400;   // ASN.1, extensions, noms — hors clé et signature

function handshake(echange, signature, nbCerts) {
  const e = ECHANGE[echange], s = SIGNATURE[signature];
  const clientHello = 300 + e.client;
  const serverHello = 150 + e.serveur;

  // À COMPLÉTER — coût de la chaîne de certificats puis du CertificateVerify.
  // Chaque certificat porte une clé publique, la signature de son émetteur,
  // et l'en-tête. Le CertificateVerify est UNE signature de plus.
  const chaine = 0;
  const certificateVerify = 0;

  const total = clientHello + serverHello + chaine + certificateVerify + 100;
  return { clientHello, serverHello, chaine, certificateVerify, total };
}

const CAS = [
  ["classique",            "X25519",         "ECDSA P-256", 2],
  ["hybride, certs RSA/EC", "X25519MLKEM768", "ECDSA P-256", 2],
  ["tout post-quantique",   "X25519MLKEM768", "ML-DSA-44",   2],
  ["PQ avec Falcon",        "X25519MLKEM768", "Falcon-512",  2],
  ["PQ avec SLH-DSA",       "X25519MLKEM768", "SLH-DSA-128s", 2],
];

console.log("cas                    | CH   | SH   | chaîne | total  | segments | tient en initcwnd");
for (const [nom, e, s, n] of CAS) {
  const h = handshake(e, s, n);
  const seg = Math.ceil(h.total / SEGMENT);
  console.log(
    `${nom.padEnd(22)} | ${String(h.clientHello).padStart(4)} | ${String(h.serverHello).padStart(4)}` +
    ` | ${String(h.chaine).padStart(6)} | ${String(h.total).padStart(6)}` +
    ` | ${String(seg).padStart(8)} | ${seg <= INITCWND ? "oui" : "NON (+1 aller-retour)"}`
  );
  if (h.clientHello > MTU - 100) console.log(`   ↑ ClientHello dépasse la MTU : fragmenté sur 2 segments`);
}

Solution

const MTU = 1500;
const SEGMENT = 1400;
const INITCWND = 10;

const ECHANGE = {
  "X25519":            { client: 32,   serveur: 32 },
  "ML-KEM-768":        { client: 1184, serveur: 1088 },
  "X25519MLKEM768":    { client: 1216, serveur: 1120 },
};

const SIGNATURE = {
  "ECDSA P-256": { pk: 64,   sig: 64 },
  "Ed25519":     { pk: 32,   sig: 64 },
  "ML-DSA-44":   { pk: 1312, sig: 2420 },
  "Falcon-512":  { pk: 897,  sig: 666 },
  "SLH-DSA-128s":{ pk: 32,   sig: 7856 },
};

const ENTETE_CERT = 400;

function handshake(echange, signature, nbCerts) {
  const e = ECHANGE[echange], s = SIGNATURE[signature];
  const clientHello = 300 + e.client;
  const serverHello = 150 + e.serveur;

  // Chaque certificat de la chaîne porte SA clé publique et la signature de
  // son émetteur : les deux coûts se cumulent, et se cumulent par certificat.
  const chaine = nbCerts * (s.pk + s.sig + ENTETE_CERT);
  // Le CertificateVerify prouve la possession de la clé du certificat
  // terminal : une signature de plus, sur le transcript.
  const certificateVerify = s.sig;

  const total = clientHello + serverHello + chaine + certificateVerify + 100;
  return { clientHello, serverHello, chaine, certificateVerify, total };
}

const CAS = [
  ["classique",            "X25519",         "ECDSA P-256", 2],
  ["hybride, certs RSA/EC", "X25519MLKEM768", "ECDSA P-256", 2],
  ["tout post-quantique",   "X25519MLKEM768", "ML-DSA-44",   2],
  ["PQ avec Falcon",        "X25519MLKEM768", "Falcon-512",  2],
  ["PQ avec SLH-DSA",       "X25519MLKEM768", "SLH-DSA-128s", 2],
];

console.log("cas                    | CH   | SH   | chaîne | total  | segments | tient en initcwnd");
for (const [nom, e, s, n] of CAS) {
  const h = handshake(e, s, n);
  const seg = Math.ceil(h.total / SEGMENT);
  console.log(
    `${nom.padEnd(22)} | ${String(h.clientHello).padStart(4)} | ${String(h.serverHello).padStart(4)}` +
    ` | ${String(h.chaine).padStart(6)} | ${String(h.total).padStart(6)}` +
    ` | ${String(seg).padStart(8)} | ${seg <= INITCWND ? "oui" : "NON (+1 aller-retour)"}`
  );
  if (h.clientHello > MTU - 100) console.log(`   ↑ ClientHello dépasse la MTU : fragmenté sur 2 segments`);
}

// Quatre lectures, et la troisième est celle qui surprend.
//
// 1. L'HYBRIDE SEUL EST ABORDABLE. Passer de 1600 à environ 3900 octets
//    tient largement dans la fenêtre initiale. C'est pourquoi les
//    navigateurs ont pu l'activer par défaut sans rien casser — sauf pour
//    quelques équipements intermédiaires que le ClientHello fragmenté a
//    perturbés, ce que la ligne d'avertissement signale.
//
// 2. CE SONT LES CERTIFICATS QUI COÛTENT. Le passage de certificats ECDSA à
//    ML-DSA triple à lui seul le handshake. La chaîne pèse plus que
//    l'échange de clés, et de loin.
//
// 3. SLH-DSA EST HORS JEU EN TLS. Avec des signatures de 7856 octets et deux
//    certificats plus le CertificateVerify, on dépasse les 25 kio : trois
//    aller-retours supplémentaires. C'est un excellent schéma pour signer un
//    firmware une fois par trimestre, un très mauvais pour un handshake.
//
// 4. FALCON EST LE PLUS ÉCONOMIQUE des trois post-quantiques, ce qui explique
//    l'intérêt persistant pour lui malgré ses difficultés d'implémentation.
//
// Conclusion opérationnelle : migrez d'abord l'échange de clés — urgent à
// cause de la récolte anticipée, et peu coûteux. Les certificats sont moins
// urgents (la signature n'a pas à résister rétroactivement) et bien plus
// chers : le temps gagné sert à laisser mûrir les solutions de compression
// de chaînes.

À retenir

Flashcards · 3 cartes

Que garantit un combinateur hybride, et pourquoi concaténer plutôt que XOR ?
Il garantit que l'ensemble reste sûr tant qu'AU MOINS UN des deux mécanismes tient — la leçon de SIKE. On concatène les deux secrets et le transcript avant de hacher, parce que le XOR exige l'indépendance des deux secrets, hypothèse qu'on ne veut pas avoir à faire.
Pourquoi l'échange de clés a-t-il migré avant les certificats ?
Deux raisons qui vont dans le même sens. L'urgence : la récolte anticipée menace la confidentialité dès aujourd'hui, alors qu'une signature exige la machine au moment de la connexion. Le coût : X25519MLKEM768 double le handshake, des certificats ML-DSA le multiplient par huit et débordent la fenêtre de congestion initiale, coûtant un aller-retour.
Quel a été l'incident de déploiement principal de l'hybridation TLS ?
La fragmentation du ClientHello. Avec 1216 octets de part de clé, il dépasse la MTU et s'étale sur deux segments TCP — ce qui est légal mais que certains équipements intermédiaires ne supportaient pas, parce qu'ils supposaient sans jamais l'écrire qu'un ClientHello tenait dans un paquet.

Chapitre 2 · 4 h

Agilité cryptographique et gouvernance

Inventaire cryptographique et CBOM, plan de migration par criticité, normalisation FIPS/ETSI/IETF, dette cryptographique et rejeu du scénario.

Dernier chapitre, et le seul qui ne contienne pas de mathématiques. C'est aussi celui dont vos étudiants auront le plus besoin, parce que la migration post-quantique échouera rarement sur un problème cryptographique et souvent sur un problème d'inventaire.

On ne migre pas ce qu'on ne connaît pas

Toutes les organisations qui ont commencé une migration rapportent la même surprise : elles ne savaient pas où était leur cryptographie.

Elle est dans le code applicatif, mais aussi dans des bibliothèques transitives dont personne ne connaît la liste, dans des configurations de serveurs web, dans des certificats émis il y a huit ans par une équipe dissoute, dans des équipements réseau dont le fournisseur a disparu, dans des protocoles industriels non documentés, dans des cartes à puce, dans des sauvegardes chiffrées avec une clé conservée ailleurs.

Le préalable est donc un inventaire cryptographique, et il doit répondre à quatre questions pour chaque usage : quel algorithme et quelle taille de clé ; quelle donnée est protégée et pendant combien de temps ; qui est responsable du composant ; et peut-on en changer sans remplacer le matériel.

La quatrième question est celle qu'on oublie, et c'est la plus discriminante. Un système « agile » se migre par une mise à jour logicielle. Un système non agile — une clé publique gravée dans un composant, un protocole propriétaire à algorithme figé — a un temps de migration qu'aucun budget ne réduira. Il faut alors agir sur le prochain cycle d'achat, c'est-à-dire aujourd'hui pour un problème qui se manifestera dans dix ans.

Le CBOM

L'inventaire ne vaut que s'il est automatisable et versionné. Un tableur mis à jour une fois par an décrit surtout l'organisation d'il y a un an.

Le format qui s'impose est le CBOMCryptography Bill of Materials — une extension du format de nomenclature logicielle CycloneDX. Il décrit les actifs cryptographiques comme un SBOM décrit les dépendances : algorithmes, tailles de clés, protocoles, certificats, points d'usage, et les relations entre eux.

Trois bénéfices, dans l'ordre de leur importance pratique.

Il est produit par outillage — analyse statique, inspection des binaires, sondes réseau — donc il ne dépend pas de la mémoire des équipes.

Il est différentiel : on compare deux versions et l'on voit ce qui a bougé, ce qui permet de suivre la migration au lieu de la constater.

Il est interrogeable : le jour où un algorithme est cassé, la question « où l'utilisons-nous ? » reçoit une réponse en minutes plutôt qu'en trimestres. C'est cette propriété, et non la conformité, qui justifie l'effort.

Prioriser

Le chapitre 1 a donné la règle : X+Y>ZX + Y > Z. Le chapitre 13 a ajouté la dissociation entre échange de clés et signatures. Ensemble, ils donnent un ordre de traitement défendable.

D'abord, l'échange de clés protégeant des données à longue durée de vie. C'est la seule catégorie où la récolte anticipée mord, et l'hybridation y est peu coûteuse.

Ensuite, les signatures à longue durée de vérification — firmwares, racines de confiance, horodatage légal. Non pas parce que la récolte les menace, mais parce que leur YY est long et souvent irréductible.

Ensuite seulement, le reste des signatures, en attendant que la compression des chaînes de certificats mûrisse.

Et hors périmètre, le symétrique : vérifier qu'AES est en 256 bits et passer à autre chose. Un plan qui consacre un chapitre à « migrer AES » gaspille du budget et, plus grave, de la crédibilité auprès des équipes techniques.

L'exercice de ce chapitre montre que ce classement ne ressemble pas à celui de l'intuition : le portail client, actif le plus visible, arrive en bas ; les archives, que personne ne réclame, arrivent en haut.

Quiz · 1 question

Quelle question de l'inventaire est la plus discriminante pour établir un plan ?

  • Quel algorithme et quelle taille de clé sont employés
  • Peut-on changer d'algorithme sans remplacer le matériel
  • Quelle équipe est responsable du composant

Réponse : L'algorithme et le responsable se découvrent par outillage ou par organigramme. L'agilité, elle, détermine Y — et un système non agile a un Y qu'aucun budget ne réduit, parce qu'il faut attendre le cycle de remplacement du matériel. C'est la seule variable de l'inégalité de Mosca sur laquelle on peut agir, et c'est aussi la seule qu'on ne peut pas rattraper une fois le matériel déployé.

L'agilité cryptographique

Le vrai objectif de la migration n'est pas d'arriver à ML-KEM. C'est d'arriver à un état où le prochain changement d'algorithme ne sera plus un projet.

Quatre propriétés caractérisent un système agile.

L'algorithme est une donnée, pas du code. Il se lit dans une configuration ou une politique, et le changer ne demande pas de recompiler.

Les identifiants d'algorithme circulent dans les formats. Les messages, certificats et fichiers chiffrés indiquent explicitement l'algorithme employé, ce qui rend possible la coexistence de deux générations pendant la transition.

Les tailles ne sont pas figées. C'est le piège le plus fréquent : un champ de base de données dimensionné pour une signature ECDSA de 64 octets, un tampon de 256 octets pour une clé publique, un format binaire à longueur fixe. Ces hypothèses se découvrent au pire moment.

La transition est prévue dans le protocole. Négociation, repli, hybridation : la possibilité de faire coexister deux algorithmes doit exister avant d'en avoir besoin.

Cette dernière propriété est ce qui a permis à TLS 1.3 d'absorber l'hybridation sans modification, comme le chapitre 13 l'a montré. TLS était agile ; la plupart des systèmes ne le sont pas.

Qui publie quoi

OrganismeRôleTextes de référence
NISTnormes d'algorithmesFIPS 203 (ML-KEM), 204 (ML-DSA), 205 (SLH-DSA)
NISTtransition et pratiqueIR 8547, SP 800-208, SP 1800-38
IETFintégration protocolaireTLS hybride, LAMPS pour les certificats, SSH
ETSIméthodologie de migrationgroupe cryptographie quantique sûre
ISO/IECnormes complémentairesMcEliece, FrodoKEM
ANSSIdoctrine françaiseavis sur la migration, exigence d'hybridation
BSIdoctrine allemanderecommandations incluant McEliece et FrodoKEM

Deux remarques pour orienter la lecture. Le NIST normalise des algorithmes ; l'IETF normalise leur usage dans les protocoles, et c'est ce second travail qui conditionne les déploiements. Et les agences nationales ne s'alignent pas exactement : l'exigence d'hybridation de l'ANSSI est plus stricte que la position du NIST, et le BSI recommande des schémas que le NIST n'a pas retenus. Une organisation multinationale doit satisfaire la plus contraignante.

Rejouer le scénario

Terminons par l'exercice que ce cours prépare depuis le chapitre 10.

Supposons qu'une attaque efficace contre Module-LWE soit publiée demain matin. ML-KEM et ML-DSA tombent. Que se passe-t-il dans votre organisation ?

Les questions à poser, dans l'ordre :

  • Combien de temps pour savoir où vous utilisez ML-KEM ? Si la réponse dépasse la semaine, votre inventaire est le problème.
  • Vos déploiements sont-ils hybrides ? Si oui, vous conservez la sécurité classique et vous avez le temps de réagir. Si non, vous êtes nu — c'est le 30 juillet 2022 de SIKE.
  • Pouvez-vous basculer vers une autre famille — HQC pour l'encapsulation, SLH-DSA pour la signature — sans réécrire vos applications ? C'est le test d'agilité, et c'est la raison pour laquelle le NIST a normalisé des schémas reposant sur des hypothèses différentes.
  • Vos données déjà chiffrées sont-elles rechiffrables, ou faut-il les considérer comme compromises ?

Ce scénario n'est pas une hypothèse d'école. Il s'est produit pour SIKE, et pour Rainbow, à quelques mois d'intervalle, sur des candidats arrivés en finale d'un processus de normalisation international. La question n'est pas de savoir s'il se reproduira mais de savoir si vous serez en mesure d'y répondre.

Quiz · 1 question

Quel est le véritable objectif d'une migration post-quantique bien menée ?

  • Avoir déployé ML-KEM et ML-DSA partout
  • Être dans un état où le prochain changement d'algorithme ne sera plus un projet
  • Avoir obtenu la conformité aux calendriers du NIST

Réponse : Déployer ML-KEM est un moyen, et un moyen qui peut être invalidé — SIKE et Rainbow rappellent qu'un schéma normalisé peut tomber. La conformité est une contrainte, pas un but. Ce qui a de la valeur durable, c'est l'agilité : un inventaire à jour, des algorithmes en configuration plutôt qu'en dur, des tailles non figées et des protocoles qui savent négocier. C'est ce qui rend le PROCHAIN changement peu coûteux, et il y aura un prochain changement.

À vous

Exercice de code

Implémentez le tri de l'inventaire, puis comparez le classement obtenu à celui que l'intuition aurait produit.

Point de départ

// Un inventaire cryptographique réduit à l'essentiel, et le tri qui en fait
// un plan de migration. C'est l'exercice le plus proche de ce que vous ferez
// réellement en entreprise.

const ANNEE = 2026;
const Z = 15;   // horizon CRQC retenu, en années — hypothèse à assumer

// X = durée de vie de la donnée ou de la vérification, Y = temps de migration
const INVENTAIRE = [
  { actif: "Terminaison TLS du portail client", algo: "ECDHE P-256", role: "confidentialite", X: 2,  Y: 1, agile: true },
  { actif: "Archives de santé chiffrées",        algo: "RSA-2048",    role: "confidentialite", X: 50, Y: 3, agile: true },
  { actif: "VPN site à site (siège ↔ usine)",    algo: "IKEv2 ECDH",  role: "confidentialite", X: 10, Y: 2, agile: true },
  { actif: "Racine de confiance en silicium",    algo: "ECDSA P-256", role: "signature",       X: 25, Y: 8, agile: false },
  { actif: "Signature des mises à jour",         algo: "RSA-4096",    role: "signature",       X: 12, Y: 4, agile: true },
  { actif: "Sauvegardes hors ligne",             algo: "AES-256",     role: "symetrique",      X: 30, Y: 1, agile: true },
  { actif: "Jetons de session (24 h)",           algo: "HMAC-SHA256", role: "symetrique",      X: 1,  Y: 1, agile: true },
  { actif: "Horodatage légal",                   algo: "ECDSA P-256", role: "signature",       X: 30, Y: 5, agile: true },
];

// Le symétrique n'est pas menacé : il suffit de vérifier la taille de clé.
const MENACE = { confidentialite: true, signature: true, symetrique: false };

function evaluer(e) {
  // À COMPLÉTER — renvoyer { urgence, marge, note } où :
  //   marge   = Z - (X + Y)
  //   urgence = "hors périmètre" si l'algorithme n'est pas menacé,
  //             "CRITIQUE" si marge < 0, "à planifier" si marge < 5,
  //             "surveillance" sinon
  //   note    = un commentaire libre, notamment si l'actif n'est pas agile
  return { urgence: "?", marge: 0, note: "" };
}

const RANG = { "CRITIQUE": 0, "à planifier": 1, "surveillance": 2, "hors périmètre": 3 };

const evalues = INVENTAIRE.map((e) => ({ ...e, ...evaluer(e) }))
  .sort((a, b) => RANG[a.urgence] - RANG[b.urgence] || a.marge - b.marge);

console.log("urgence        | marge | actif                              | note");
for (const e of evalues) {
  console.log(
    `${e.urgence.padEnd(14)} | ${String(e.marge).padStart(5)} | ${e.actif.padEnd(34)} | ${e.note}`
  );
}

Solution

const ANNEE = 2026;
const Z = 15;

const INVENTAIRE = [
  { actif: "Terminaison TLS du portail client", algo: "ECDHE P-256", role: "confidentialite", X: 2,  Y: 1, agile: true },
  { actif: "Archives de santé chiffrées",        algo: "RSA-2048",    role: "confidentialite", X: 50, Y: 3, agile: true },
  { actif: "VPN site à site (siège ↔ usine)",    algo: "IKEv2 ECDH",  role: "confidentialite", X: 10, Y: 2, agile: true },
  { actif: "Racine de confiance en silicium",    algo: "ECDSA P-256", role: "signature",       X: 25, Y: 8, agile: false },
  { actif: "Signature des mises à jour",         algo: "RSA-4096",    role: "signature",       X: 12, Y: 4, agile: true },
  { actif: "Sauvegardes hors ligne",             algo: "AES-256",     role: "symetrique",      X: 30, Y: 1, agile: true },
  { actif: "Jetons de session (24 h)",           algo: "HMAC-SHA256", role: "symetrique",      X: 1,  Y: 1, agile: true },
  { actif: "Horodatage légal",                   algo: "ECDSA P-256", role: "signature",       X: 30, Y: 5, agile: true },
];

const MENACE = { confidentialite: true, signature: true, symetrique: false };

function evaluer(e) {
  const marge = Z - (e.X + e.Y);

  if (!MENACE[e.role]) {
    return { urgence: "hors périmètre", marge, note: "symétrique : vérifier ≥ 256 bits, rien d'autre" };
  }

  const urgence = marge < 0 ? "CRITIQUE" : marge < 5 ? "à planifier" : "surveillance";

  // L'agilité n'entre pas dans l'inégalité de Mosca, mais elle gouverne Y —
  // et un actif non agile a un Y qu'on ne peut PAS réduire en y mettant des
  // moyens. C'est la seule ligne qui mérite un traitement à part.
  const note = e.agile
    ? (e.role === "signature" ? "signature : pas de récolte anticipée, mais durée de vérification" : "confidentialité : exposée à la récolte anticipée")
    : "NON AGILE — Y irréductible, à traiter au prochain cycle matériel";

  return { urgence, marge, note };
}

const RANG = { "CRITIQUE": 0, "à planifier": 1, "surveillance": 2, "hors périmètre": 3 };

const evalues = INVENTAIRE.map((e) => ({ ...e, ...evaluer(e) }))
  .sort((a, b) => RANG[a.urgence] - RANG[b.urgence] || a.marge - b.marge);

console.log("urgence        | marge | actif                              | note");
for (const e of evalues) {
  console.log(
    `${e.urgence.padEnd(14)} | ${String(e.marge).padStart(5)} | ${e.actif.padEnd(34)} | ${e.note}`
  );
}

// Quatre enseignements du classement obtenu.
//
// 1. LA TERMINAISON TLS DU PORTAIL, l'actif le plus visible et celui que
//    tout le monde migre en premier, arrive en bas du tableau. X = 2 ans :
//    la donnée n'a plus de valeur quand la machine arrivera. Ce n'est pas
//    une raison de ne pas la migrer — c'est facile et c'est déjà fait dans
//    les navigateurs — mais ce n'est pas là que se joue le risque.
//
// 2. LES ARCHIVES DE SANTÉ sont critiques avec une marge très négative, et
//    elles n'ont aucune visibilité. Personne ne réclame leur migration.
//
// 3. LA RACINE DE CONFIANCE EN SILICIUM est le cas désespérant : Y = 8 ans
//    et NON AGILE. On ne peut pas accélérer une migration qui suppose de
//    changer le matériel. La seule action possible est d'exiger l'agilité
//    dans les spécifications d'achat du prochain cycle — c'est-à-dire
//    d'agir aujourd'hui sur un problème qui se manifestera dans dix ans.
//
// 4. LES SAUVEGARDES EN AES-256 sortent du périmètre. Grover les ramène à
//    128 bits, ce qui reste hors d'atteinte. Un plan de migration qui les
//    inclut gaspille du budget et de la crédibilité.
//
// La leçon de gouvernance : le classement par urgence réelle ne ressemble
// PAS au classement par visibilité. Un plan crédible se défend sur X et Y,
// pas sur l'importance ressentie des systèmes.

Ce que vous emportez de cette unité

Quatorze chapitres, et trois idées qui les traversent.

La difficulté est dans la description, pas dans l'objet. Un réseau est public, une base courte est secrète. Un code est public, sa structure de Goppa est secrète. Un système quadratique est public, l'espace d'huile est secret. La cryptographie asymétrique post-quantique est, à chaque fois, l'écart entre deux descriptions du même objet.

Une preuve borne une classe d'attaques, jamais les attaques. Le modèle QROM ne connaît ni le chronomètre ni le laser, et c'est par là que passent la plupart des cassures réelles. La sécurité effective se joue dans l'implémentation.

L'humilité est une exigence technique, pas une posture. SIKE avait onze ans d'examen public et une preuve de sécurité. Il est tombé en une après-midi, sur un théorème de 1997 que personne n'avait rapproché du sujet. C'est ce qui justifie l'hybridation, la normalisation de familles concurrentes, et l'agilité — trois formes du même refus de tout parier sur une seule hypothèse.

À retenir

Flashcards · 3 cartes

Pourquoi l'inventaire cryptographique est-il le préalable de toute migration ?
Parce qu'on ne migre pas ce qu'on ne connaît pas, et que la cryptographie est partout : bibliothèques transitives, configurations, certificats orphelins, équipements dont le fournisseur a disparu. Le CBOM (extension de CycloneDX) l'automatise, le versionne et le rend interrogeable — de sorte que « où utilisons-nous cet algorithme ? » se réponde en minutes le jour où il est cassé.
Quelles sont les quatre propriétés d'un système cryptographiquement agile ?
L'algorithme est une donnée de configuration, pas du code. Les identifiants d'algorithme circulent dans les formats, permettant la coexistence de deux générations. Les tailles ne sont pas figées — ni en base, ni en tampon, ni en format binaire. Et la transition (négociation, repli, hybridation) est prévue dans le protocole AVANT d'en avoir besoin.
Que faut-il vérifier en rejouant le scénario « Module-LWE tombe demain » ?
Combien de temps pour savoir où vous l'utilisez (test de l'inventaire) ; si vos déploiements sont hybrides (auquel cas la sécurité classique subsiste) ; si vous pouvez basculer vers une autre famille — HQC, SLH-DSA — sans réécrire vos applications (test de l'agilité) ; et si vos données déjà chiffrées sont rechiffrables ou doivent être considérées comme compromises.

QCM du bloc IV — Migration

Huit questions de décision plutôt que de connaissance : à chaque fois, une situation et un arbitrage à défendre. C'est le format le plus proche de ce qu'on vous demandera en poste.

QCM de bloc · 8 questions

Migration

1. Que garantit un combinateur hybride ?

  • Une sécurité doublée par rapport à chacun des deux mécanismes
  • La sécurité tant que les DEUX mécanismes tiennent
  • La sécurité tant qu'AU MOINS UN des deux tient

Réponse : C'est toute la propriété visée, et elle est plus forte qu'un simple cumul. Exiger que les deux tiennent serait un affaiblissement — on aurait deux occasions de tomber au lieu d'une. La formulation « au moins un » est ce qui a permis aux déploiements X25519 + SIKE de ne rien perdre le 30 juillet 2022 : il leur restait la sécurité classique de X25519.

2. Pourquoi TLS concatène-t-il les deux secrets avant de les hacher, plutôt que de les combiner par OU exclusif ?

  • Parce que le XOR exige l'indépendance des deux secrets, hypothèse qu'on ne veut pas avoir à faire
  • Parce que le XOR est plus coûteux en calcul
  • Parce que les deux secrets n'ont pas la même longueur

Réponse : Le XOR est trivialement rapide, et une différence de longueur se règle par bourrage. Le problème est l'hypothèse : le XOR n'est uniforme que si l'un des secrets l'est ET qu'ils sont indépendants. Or les deux mécanismes peuvent partager un générateur d'aléa ou être corrélés d'une manière imprévue. La concaténation suivie d'un haché ne fait aucune hypothèse d'indépendance.

3. Quel a été l'incident principal du déploiement de X25519MLKEM768 ?

  • Une baisse notable des performances des serveurs TLS
  • La fragmentation du ClientHello sur deux segments TCP, que certains équipements intermédiaires ne supportaient pas
  • Une incompatibilité avec la négociation de TLS 1.3, qui a dû être amendée

Réponse : TLS 1.3 n'a pas eu à changer d'une ligne : le groupe hybride s'enregistre comme un groupe supplémentaire, et un serveur qui ne le connaît pas retombe sur X25519. Le coût de calcul de ML-KEM est négligeable. Ce qui a cassé, ce sont des équipements qui supposaient — sans jamais l'écrire — qu'un ClientHello tenait dans un seul paquet.

4. Dans un handshake TLS entièrement post-quantique, le poste le plus coûteux en octets est :

  • l'échange de clés hybride
  • la chaîne de certificats et le CertificateVerify
  • le transcript haché du handshake

Réponse : L'échange hybride ajoute environ 2300 octets, ce qui reste absorbable. Une chaîne de deux certificats ML-DSA-44 plus le CertificateVerify en ajoute plus de 10 000 : chaque certificat porte une clé publique ET la signature de son émetteur, et les deux coûts se cumulent par certificat. Le transcript, lui, est un haché de taille fixe.

5. Faut-il migrer les certificats en même temps que l'échange de clés ?

  • Non : l'échange est urgent et peu coûteux, les certificats sont moins urgents et bien plus chers
  • Oui, sinon la chaîne de certificats devient le maillon faible
  • Non, les certificats ne sont pas concernés par la menace quantique

Réponse : Les certificats sont bien concernés : un attaquant quantique pourrait forger une signature ECDSA et usurper un serveur. Mais cela exige la machine AU MOMENT de la connexion, alors que la récolte anticipée menace la confidentialité dès aujourd'hui. La chaîne n'est donc pas le maillon faible dans le temps, et comme elle coûte huit fois plus cher en octets, dissocier les deux chantiers est le bon arbitrage.

6. Quelle question de l'inventaire cryptographique est la plus discriminante pour bâtir un plan ?

  • Quel algorithme et quelle taille de clé sont employés
  • Quelle équipe est responsable du composant
  • Peut-on changer d'algorithme sans remplacer le matériel

Réponse : L'algorithme se découvre par outillage, le responsable par organigramme. L'agilité, elle, détermine Y — et un système non agile a un Y qu'aucun budget ne réduit, puisqu'il faut attendre le cycle de remplacement du matériel. C'est la seule variable de Mosca sur laquelle on peut agir, et la seule qu'on ne peut plus rattraper une fois le matériel déployé.

7. Un plan de migration consacre un chapitre entier à « migrer AES-256 ».

  • C'est prudent : Grover menace toutes les primitives
  • C'est du gaspillage : Grover ramène AES-256 à 128 bits, ce qui reste hors d'atteinte
  • C'est obligatoire pour la conformité aux calendriers du NIST

Réponse : Le symétrique se répare en doublant la clé, et AES-256 est déjà doublé. Les 2¹²⁸ évaluations largement séquentielles d'un circuit AES réversible sont hors de portée de toute machine imaginable. Un plan qui inclut ce chantier gaspille du budget et, plus grave, de la crédibilité auprès des équipes techniques — qui savent lire le tableau du chapitre 1.

8. Quel est l'objectif d'une migration post-quantique bien menée ?

  • Atteindre un état où le prochain changement d'algorithme ne sera plus un projet
  • Avoir déployé ML-KEM et ML-DSA sur l'ensemble du parc
  • Obtenir la conformité aux calendriers publiés par le NIST

Réponse : Déployer ML-KEM est un moyen, et un moyen qui peut être invalidé — SIKE et Rainbow rappellent qu'un candidat en finale peut tomber. La conformité est une contrainte, pas un but. Ce qui a de la valeur durable, c'est l'agilité : inventaire à jour, algorithmes en configuration plutôt qu'en dur, tailles non figées, protocoles qui savent négocier. Il y aura un prochain changement.