cursus.

Cours 2 · Réseaux euclidiensLeçon 2 sur 4

LWE et ses variantes

5 h de lecture8 sections Version PDF

À la fin de cette leçon, vous saurez

Résoudre un système linéaire bruité : réduction pire cas/cas moyen de Regev, Ring-LWE et Module-LWE, SIS et signatures.

Le chapitre 4 a laissé une lacune, et il faut la nommer avant de la combler. Un réseau euclidien est un bel objet, mais rien n'y indique comment engendrer à la demande une instance difficile dont on connaît le secret. La trappe « base courte contre base longue » y ressemblait, mais nous avons vu que GGH et NTRUSign, qui la mettaient en œuvre littéralement, ont été cassés.

LWE répond exactement à cette question, et il le fait dans un langage que tout étudiant d'un cours d'algèbre linéaire comprend en une phrase.

Résoudre un système linéaire, mais bruité

Voici tout LWE en une image. On vous donne un système d'équations linéaires modulaires :

4s1+2s2=141s1+5s2=8(mod17)\begin{aligned} 4 s_1 + 2 s_2 &= 14 \\ 1 s_1 + 5 s_2 &= 8 \end{aligned} \pmod{17}

Vous le résolvez en trente secondes par élimination. Maintenant, on ajoute à chaque second membre une erreur de ±1\pm 1 — une erreur minuscule, sur des valeurs comprises entre 0 et 16. Le système devient :

4s1+2s2=151s1+5s2=7(mod17)\begin{aligned} 4 s_1 + 2 s_2 &= 15 \\ 1 s_1 + 5 s_2 &= 7 \end{aligned} \pmod{17}

Appliquez la même élimination et regardez ce qui se passe.

Animation · étape 1 / 70:00 / 0:11

4×3 + 2×1 = 14 et 1×3 + 5×1 = 8. Deux équations exactes, deux inconnues : c'est un exercice de première année.

Prêt à lancer · 0:00 / 0:11
Étapes

Le résultat n'est pas « approximativement juste », il est absurde : s2=13s_2 = 13 au lieu de 1. La raison est visible à l'étape 5 de l'animation. Pour éliminer s1s_1, on a multiplié la seconde équation par 4 — et ce coefficient a multiplié son erreur par 4. Le bruit cumulé vaut 5, pas 1, dans un modulo de 17.

Généralisez à la dimension nn : éliminer n1n-1 inconnues demande des coefficients de l'ordre de qq, et le bruit final dépasse q/2q/2. Le résultat est alors uniformément distribué sur Zq\mathbb{Z}_q : il ne contient plus aucune information. C'est là toute l'astuce, et elle tient en une phrase — un bruit infime détruit toute méthode algébrique.

Quiz · vérifiez votre compréhension Sans réponse

Pourquoi un bruit de ±1 suffit-il à détruire l'élimination de Gauss modulo q ?

La définition, et sa version décisionnelle

Fixons le vocabulaire. Soient nn la dimension, qq le module et χ\chi une distribution de bruit concentrée près de zéro. Un échantillon LWE de secret sZqns \in \mathbb{Z}_q^n est un couple

(a,  b)avecaZqn uniforme,b=a,s+emodq,eχ(a, \; b) \quad \text{avec} \quad a \leftarrow \mathbb{Z}_q^n \text{ uniforme}, \quad b = \langle a, s\rangle + e \bmod q, \quad e \leftarrow \chi

Le problème de recherche demande de retrouver ss à partir de mm échantillons. Le problème décisionnel demande seulement de distinguer une suite d'échantillons LWE d'une suite de couples uniformes. Ces deux problèmes sont équivalents pour les paramètres usuels, et c'est le décisionnel qui sert dans les preuves : il donne directement l'indistinguabilité dont les jeux IND-CPA ont besoin.

Deux paramètres gouvernent la difficulté : la dimension nn et le rapport bruit sur module α=σ/q\alpha = \sigma / q. Un bruit trop faible rend le problème facile ; un bruit trop fort rend le déchiffrement impossible. Tout le dimensionnement de ML-KEM tient dans cet équilibre.

La réduction de Regev

Voici ce qui distingue LWE de toutes les hypothèses classiques, et il faut l'énoncer précisément parce que c'est souvent déformé.

Regev a démontré en 2005 que résoudre LWE en moyenne est au moins aussi difficile que résoudre certains problèmes de réseau dans le pire cas — GapSVP et SIVP avec un facteur d'approximation O~(n/α)\tilde{O}(n/\alpha). La réduction originale est quantique ; Peikert en a donné en 2009 une version classique, au prix d'un module qq plus grand.

Ce que cela signifie, concrètement : si quelqu'un trouve un algorithme qui casse LWE sur des instances tirées au hasard — c'est-à-dire sur les clés que produit votre générateur — alors le même algorithme résout toutes les instances du problème de réseau correspondant, y compris les plus difficiles. Il n'existe donc pas de « clés faibles » à craindre : le tirage aléatoire ne peut pas tomber sur une instance accidentellement facile.

Comparez avec RSA. Personne ne sait montrer que factoriser un module tiré au hasard est aussi difficile que factoriser le pire module possible. On y croit ; on ne le démontre pas.

Deux réserves, pour rester honnête. D'abord, la réduction porte sur des facteurs d'approximation polynomiaux, pour lesquels le problème de réseau n'est ni prouvé NP-difficile ni supposé l'être — c'est la nuance du chapitre 4. Ensuite, elle est lâche : appliquée telle quelle, elle imposerait des paramètres bien plus gros que ceux de ML-KEM. Les paramètres réels sont fixés par l'estimation d'attaque du chapitre 4, pas par la réduction. Celle-ci sert de garantie structurelle, pas de règle de dimensionnement.

De LWE au réseau, et retour

La boucle se referme ici. À partir de mm échantillons (A,b)(A, b), on construit le réseau qq-aire

Λ={vZm  :  vAx(modq) pour un x}\Lambda = \{\, v \in \mathbb{Z}^m \;:\; v \equiv A x \pmod q \text{ pour un } x \,\}

Le vecteur bb est proche de ce réseau — à distance e\|e\|, qui est petite. Résoudre LWE, c'est donc résoudre CVP sur Λ\Lambda avec la promesse que la cible est anormalement proche. L'attaque primale plonge le tout dans un réseau où le secret devient un vecteur unique et court, et lance BKZ ; l'attaque duale cherche des vecteurs courts du réseau orthogonal pour distinguer. Dans les deux cas, le coût est celui du chapitre 4 : 20,292β2^{0{,}292\beta}.

Autrement dit, LWE n'est pas un nouveau problème difficile. C'est une présentation du problème de réseau qui rend l'engendrement d'instances trivial : tirer AA au hasard, tirer ss et ee petits, publier (A,As+e)(A, As+e).

Quiz · vérifiez votre compréhension Sans réponse

Que garantit exactement la réduction de Regev ?

Ring-LWE et Module-LWE : ce qu'on gagne, ce qu'on risque

LWE « plein » a un défaut rédhibitoire : la matrice AA fait m×nm \times n éléments. Pour des paramètres réalistes, la clé publique se compte en mégaoctets. C'est inutilisable.

Ring-LWE remplace les vecteurs par des éléments de l'anneau RqR_q du chapitre 3. Un seul polynôme aa remplace toute une matrice, parce que la multiplication dans l'anneau encode implicitement une matrice circulante. On gagne un facteur nn en taille de clé et, grâce à la NTT, un facteur n/lognn/\log n en temps de calcul. Le gain est spectaculaire.

Il n'est pas gratuit. Cette matrice implicite n'est pas quelconque : elle a une structure algébrique, et une structure est toujours une prise potentielle. On sait aujourd'hui que certains problèmes sur les réseaux idéaux — pas Ring-LWE lui-même, mais des cousins proches — admettent des algorithmes quantiques meilleurs que dans le cas général pour certains facteurs d'approximation. Ces résultats ne cassent pas Ring-LWE. Ils démontrent que la structure n'est pas neutre, et qu'elle mérite une prudence que le cas non structuré n'exige pas.

Module-LWE est le compromis, et c'est celui que le NIST a normalisé. On travaille avec des vecteurs de dimension kk dont les entrées sont des éléments de l'anneau. Pour k=1k = 1 on retrouve Ring-LWE ; pour k=nk = n on retrouve LWE plein. ML-KEM prend k=2,3k = 2, 3 ou 44 avec n=256n = 256.

Le bénéfice est double, et le second est le plus intéressant en pratique. D'une part, on réduit la structure algébrique en jouant sur kk plutôt que sur nn. D'autre part, changer de niveau de sécurité ne change que kk : l'anneau reste le même, donc la NTT, les tables et le code d'arithmétique sont identiques pour les trois jeux de paramètres. Une implémentation, trois niveaux.

SIS, le problème dual

LWE sert au chiffrement. Les signatures ont besoin de son pendant, SISShort Integer Solution.

Étant donné AZqn×mA \in \mathbb{Z}_q^{n \times m} uniforme, trouver z0z \neq 0 court tel que

Az0(modq)A z \equiv 0 \pmod q

Il existe une infinité de solutions dès que m>nm > n ; la difficulté est d'en trouver une petite. Ajtai a démontré dès 1996 la difficulté pire cas vers cas moyen de SIS, ce qui en fait historiquement la première construction de ce type.

L'intuition de la dualité : LWE cache un secret dans du bruit, SIS demande d'exhiber un objet court. Le chiffrement a besoin de cacher, la signature a besoin de prouver qu'on sait produire quelque chose de court sans révéler comment. Le chapitre 7 montre comment ML-DSA convertit cela en signature.

À vous

Exercice · JavaScript · à vous de jouer

Complétez le score de la force brute, puis lisez la dernière colonne : c'est elle qui dit pourquoi la dimension 768 protège et pas la dimension 2.

En attente
// LWE en miniature. q = 17, dimension n = 2, secret s = (3, 1).
// Bruit dans {-1, 0, +1}.

const q = 17;
const n = 2;
const SECRET = [3, 1];
const mod = (x) => ((x % q) + q) % q;

const produit = (a, s) => mod(a.reduce((t, ai, i) => t + ai * s[i], 0));

// Un échantillon LWE : (a, b) avec b = <a, s> + e.
function echantillon(bruit) {
  const a = Array.from({ length: n }, () => Math.floor(Math.random() * q));
  const e = bruit ? Math.floor(Math.random() * 3) - 1 : 0;
  return { a, b: mod(produit(a, SECRET) + e), e };
}

// Attaque par force brute : essayer tous les secrets, garder celui qui
// explique le mieux les échantillons.
function forceBrute(echantillons, borne) {
  let meilleur = null;
  let essais = 0;
  for (let s1 = 0; s1 < q; s1++) {
    for (let s2 = 0; s2 < q; s2++) {
      essais++;
      const s = [s1, s2];
      // À COMPLÉTER — comptez combien d'échantillons ce candidat explique,
      // c'est-à-dire pour lesquels |b - <a,s>| (centré sur 0) est ≤ borne.
      const score = 0;
      if (!meilleur || score > meilleur.score) meilleur = { s, score };
    }
  }
  return { ...meilleur, essais };
}

// Écart centré : dans Z_q, 16 est à distance 1 de 0, pas 16.
const ecart = (x) => Math.min(mod(x), q - mod(x));

const SANS = Array.from({ length: 8 }, () => echantillon(false));
const AVEC = Array.from({ length: 8 }, () => echantillon(true));

console.log("secret réel :", SECRET);
console.log("sans bruit  :", JSON.stringify(forceBrute(SANS, 0)));
console.log("avec bruit  :", JSON.stringify(forceBrute(AVEC, 1)));

// Le coût, maintenant. En dimension n, il y a q^n secrets possibles.
console.log("\ncoût de la force brute :");
for (const dim of [2, 4, 8, 256, 768]) {
  const bits = dim * Math.log2(q);
  console.log(`  n = ${String(dim).padStart(3)}  →  q^n = 2^${bits.toFixed(0)}`);
}

Console de sortie
Le résultat s'affiche dans la console

À retenir

Flashcards · 1 / 3Toucher pour retourner
Fin de la leçon

Vous avez parcouru les 8 sections.

Marquez-la terminée pour faire avancer votre parcours, ou revenez sur un point avant de passer à la suite.