Rappels mathématiques et algorithmiquesDans le dialogue d’impression, choisissez « Enregistrer au format PDF » comme destination.
Retour

Cryptographie · C1 Socle · Chapitre 2 · 5 h

Rappels mathématiques et algorithmiques

Arithmétique modulaire, groupes cycliques et corps finis, restes chinois, exponentiation rapide, Miller-Rabin, algorithmes probabilistes polynomiaux.

La cryptographie moderne n'emprunte aux mathématiques qu'un outillage restreint. Ce chapitre le rassemble une fois pour toutes, avec un critère de sélection strict : chaque notion présentée ici sert dans un chapitre ultérieur, et aucune n'est là pour la culture.

Un conseil de méthode avant de commencer. Ne cherchez pas à retenir les démonstrations, mais les énoncés et leurs conséquences opératoires : ce que le théorème des restes chinois autorise à calculer, ce que l'ordre d'un élément interdit de faire, pourquoi un test de primalité probabiliste est acceptable pour engendrer une clé RSA.

Arithmétique modulaire

Travailler modulo nn, c'est travailler dans Z/nZ\mathbb{Z}/n\mathbb{Z}, l'ensemble des restes {0,1,,n1}\{0, 1, \dots, n-1\} muni de l'addition et de la multiplication. Addition, soustraction et multiplication s'y comportent normalement. La division, non — et c'est le seul point délicat.

L'élément aa est inversible modulo nn s'il existe bb tel que ab1(modn)ab \equiv 1 \pmod n. Cela se produit exactement quand gcd(a,n)=1\gcd(a, n) = 1, et l'algorithme d'Euclide étendu fournit l'inverse en calculant les coefficients de Bézout au+nv=1au + nv = 1.

Cherchons l'inverse de 17 modulo 43. La descente d'Euclide donne 43=2×17+943 = 2 \times 17 + 9, puis 17=1×9+817 = 1 \times 9 + 8, puis 9=1×8+19 = 1 \times 8 + 1. En remontant :

1=98=9(179)=2×917=2×(432×17)17=2×435×171 = 9 - 8 = 9 - (17 - 9) = 2 \times 9 - 17 = 2 \times (43 - 2 \times 17) - 17 = 2 \times 43 - 5 \times 17

Donc 5×171(mod43)-5 \times 17 \equiv 1 \pmod{43}, et l'inverse est 538-5 \equiv 38. Vérification : 17×38=646=15×43+117 \times 38 = 646 = 15 \times 43 + 1.

Cet algorithme est la brique qui produit l'exposant privé de RSA : dd est précisément l'inverse de ee modulo φ(n)\varphi(n).

Groupes, ordre, générateurs

Les éléments inversibles modulo nn forment un groupe multiplicatif noté (Z/nZ)(\mathbb{Z}/n\mathbb{Z})^*, de cardinal φ(n)\varphi(n) — l'indicatrice d'Euler. Pour n=pqn = pq produit de deux premiers distincts, φ(n)=(p1)(q1)\varphi(n) = (p-1)(q-1), l'égalité sur laquelle RSA est bâti tout entier.

L'ordre d'un élément aa est le plus petit k>0k > 0 tel que ak=1a^k = 1. Le théorème de Lagrange affirme qu'il divise l'ordre du groupe, d'où le théorème d'Euler :

aφ(n)1(modn)pour tout a inversiblea^{\varphi(n)} \equiv 1 \pmod n \quad \text{pour tout } a \text{ inversible}

et son cas particulier, le petit théorème de Fermat : ap11(modp)a^{p-1} \equiv 1 \pmod p pour pp premier et pap \nmid a.

Un groupe est cyclique s'il possède un générateur, c'est-à-dire un élément dont les puissances parcourent tout le groupe. Le résultat utile : (Z/pZ)(\mathbb{Z}/p\mathbb{Z})^* est cyclique d'ordre p1p-1 pour tout pp premier. Prenons p=7p = 7 et g=3g = 3 :

kk123456
3kmod73^k \bmod 7326451

Les six valeurs non nulles apparaissent : 3 est bien un générateur. Ce n'est pas le cas de tout élément — 22 a pour puissances 2,4,12, 4, 1 et engendre un sous-groupe d'ordre 3 seulement. Le nombre de générateurs est φ(p1)\varphi(p-1), soit ici φ(6)=2\varphi(6) = 2.

Cette distinction n'est pas décorative. Au chapitre 10, un Diffie-Hellman dont le générateur engendre un petit sous-groupe est cassé immédiatement : l'attaquant n'a qu'un petit nombre de valeurs à énumérer. Vérifier l'ordre du générateur fait partie de la mise en œuvre correcte, et son oubli a produit des vulnérabilités réelles.

Corps finis

Un corps fini Fq\mathbb{F}_q existe pour q=pkq = p^k, pp premier, et il est unique à isomorphisme près. Deux cas nous concernent.

Pour k=1k = 1, Fp=Z/pZ\mathbb{F}_p = \mathbb{Z}/p\mathbb{Z} : tout élément non nul y est inversible, puisque pp est premier. C'est le terrain du logarithme discret et des courbes elliptiques.

Pour p=2p = 2, F2k\mathbb{F}_{2^k} se construit comme les polynômes à coefficients dans {0,1}\{0,1\} modulo un polynôme irréductible de degré kk. Un octet devient un polynôme de degré au plus 7, l'addition devient le XOR, et la multiplication devient un produit de polynômes réduit modulo l'irréductible. AES travaille dans F28\mathbb{F}_{2^8} avec

m(x)=x8+x4+x3+x+1m(x) = x^8 + x^4 + x^3 + x + 1

Ce n'est pas un détail d'implémentation : la boîte de substitution de l'AES est l'inversion dans ce corps, suivie d'une application affine. Le chapitre 4 montrera pourquoi ce choix donne à l'AES sa résistance différentielle.

Le théorème des restes chinois

Si mm et nn sont premiers entre eux, l'application

Z/mnZ    Z/mZ×Z/nZ,x(xmodm,  xmodn)\mathbb{Z}/mn\mathbb{Z} \;\longrightarrow\; \mathbb{Z}/m\mathbb{Z} \times \mathbb{Z}/n\mathbb{Z}, \qquad x \longmapsto (x \bmod m,\; x \bmod n)

est un isomorphisme d'anneaux. Autrement dit : connaître xx modulo mm et modulo nn équivaut à le connaître modulo mnmn, et les opérations se font indifféremment d'un côté ou de l'autre.

L'exemple de Sun Tzu, vieux de dix-sept siècles : trouver xx tel que x2(mod3)x \equiv 2 \pmod 3, x3(mod5)x \equiv 3 \pmod 5, x2(mod7)x \equiv 2 \pmod 7. La solution est x=23x = 23 modulo 105.

L'usage cryptographique est immédiat. Le déchiffrement RSA calcule cdmodnc^d \bmod n avec n=pqn = pq ; en travaillant séparément modulo pp et modulo qq, les exposants sont deux fois plus courts et les modules deux fois plus petits, ce qui donne un facteur d'accélération d'environ 4. Toutes les implémentations sérieuses le font.

Et immédiatement, le revers : si une erreur matérielle survient pendant l'un des deux calculs — un rayonnement, une injection de faute volontaire — la signature produite est correcte modulo pp et fausse modulo qq. Alors gcd(sem,n)\gcd(s^e - m, n) livre pp. Une seule signature fautive suffit à factoriser le module. C'est l'attaque de Boneh, DeMillo et Lipton (1997), et c'est la raison pour laquelle une implémentation correcte revérifie sa propre signature avant de la publier.

Quiz · 1 question

Dans (Z/pZ)* avec p = 11, l'élément 3 a pour puissances 3, 9, 5, 4, 1. Que peut-on en conclure ?

  • 3 est un générateur du groupeordre 10
  • 3 engendre un sous-groupe d'ordre 5, impropre à un Diffie-Hellman sur tout le groupeordre 5
  • 3 n'est pas inversible modulo 11non inversible

Réponse : Le groupe (Z/11Z)* a 10 éléments, mais 3 revient à 1 après 5 puissances : son ordre est 5, un diviseur de 10 conforme au théorème de Lagrange. Il engendre donc un sous-groupe strict. Utiliser un tel élément comme générateur d'un Diffie-Hellman réduit l'espace des clés partagées à 5 valeurs — un attaquant les énumère toutes. Vérifier l'ordre du générateur est une étape obligatoire de la mise en œuvre.

Exponentiation rapide

Tous les schémas asymétriques calculent des aemodna^e \bmod n avec des exposants de plusieurs centaines de bits. Multiplier ee fois est hors de question ; on lit l'exposant en binaire.

Pour 313mod73^{13} \bmod 7, avec 13=1101213 = 1101_2 :

bit lucarrémultiplicationvaleur
1×3\times 33
132=23^2 = 2×3\times 36
062=16^2 = 11
112=11^2 = 1×3\times 33

Résultat 3, en quatre carrés et trois multiplications au lieu de treize. Le coût passe de O(e)O(e) à O(loge)O(\log e), et c'est ce qui rend l'asymétrique praticable.

Une mise en garde qui portera ses fruits au chapitre 9 : cet algorithme, écrit naïvement, n'est pas à temps constant. La multiplication n'a lieu que pour les bits à 1 de l'exposant ; la durée du calcul dépend donc du secret quand cet exposant est la clé privée. Mesurée assez finement, elle le révèle bit par bit. La parade usuelle est l'échelle de Montgomery, qui effectue les deux opérations à chaque tour et jette l'une des deux.

Exercice de code

Écrivez l'exponentiation modulaire par carrés, puis comparez son coût à celui de la version naïve pour l'exposant RSA 65537.

Point de départ

// Calculer a^e mod n sans jamais former a^e.
//
// BigInt est indispensable : en RSA, a et n font 2048 bits. L'écriture 3n
// désigne le BigInt 3.

// ── Version naïve, fournie pour la comparaison ────────────────────────────
function puissanceNaive(a, e, n) {
  let r = 1n, mults = 0n;
  for (let i = 0n; i < e; i++) {
    r = (r * a) % n;
    mults++;
  }
  return { valeur: r, mults };
}

// ── À COMPLÉTER : exponentiation par carrés ───────────────────────────────
// Principe : lire l'exposant en binaire. À chaque bit, on élève au carré ;
// quand le bit vaut 1, on multiplie en plus par la base.
//
//   a^13 = a^(1101 en binaire) = ((a^2 · a)^2)^2 · a
//
// Renvoyez aussi le nombre de multiplications effectuées.
function puissanceRapide(a, e, n) {
  let resultat = 1n;
  let base = a % n;
  let exposant = e;
  let mults = 0n;

  while (exposant > 0n) {
    // à compléter : traiter le bit de poids faible, puis passer au suivant
    exposant = exposant >> 1n;
  }

  return { valeur: resultat, mults };
}

// ── Vérification ──────────────────────────────────────────────────────────
const p = 1000003n; // premier
const a = 123456n;
const e = 65537n;   // l'exposant public usuel de RSA

const lent = puissanceNaive(a, e, p);
const vif = puissanceRapide(a, e, p);

console.log("naïve  :", lent.valeur, "en", lent.mults, "multiplications");
console.log("rapide :", vif.valeur, "en", vif.mults, "multiplications");
console.log(vif.valeur === lent.valeur ? "✓ même résultat" : "✗ résultats différents");

// Le rapport que vous devez observer : 65537 contre une vingtaine.
// Avec l'exposant privé d de RSA-2048, la version naïve demanderait 2^2048
// multiplications — c'est-à-dire jamais.

Solution

function puissanceRapide(a, e, n) {
  let resultat = 1n;
  let base = a % n;
  let exposant = e;
  let mults = 0n;

  while (exposant > 0n) {
    // Bit de poids faible à 1 : le facteur courant entre dans le résultat.
    if (exposant % 2n === 1n) {
      resultat = (resultat * base) % n;
      mults++;
    }
    // Passage au bit suivant : la base est élevée au carré.
    base = (base * base) % n;
    mults++;
    exposant = exposant >> 1n;
  }

  return { valeur: resultat, mults };
}

// 65537 = 2^16 + 1 : dix-sept bits, dont deux à 1.
// La boucle fait 17 carrés et 2 multiplications, soit 19 au lieu de 65537.
//
// Le coût est donc en log2(e), pas en e. C'est toute la différence entre
// « RSA chiffre en quelques millisecondes » et « RSA ne terminerait jamais ».
//
// Attention pour la suite : cette écriture est correcte mais NON constante en
// temps. Le test « if » ne s'exécute que pour les bits à 1 de l'exposant, donc
// la durée du calcul révèle le poids de Hamming de l'exposant — et, mesurée
// finement, ses bits un par un. Quand l'exposant est la clé PRIVÉE d, c'est
// une fuite directe. Le chapitre 9 y revient ; la parade usuelle est l'échelle
// de Montgomery, qui fait les deux opérations à chaque tour.

Tester la primalité

Engendrer une clé RSA demande deux grands premiers. On les obtient en tirant des entiers impairs au hasard et en les testant — la densité des premiers autour de 210242^{1024} étant d'environ 1/ln(21024)1/7101/\ln(2^{1024}) \approx 1/710, un candidat impair sur 355 environ est premier.

Le test de Fermat, qui vérifie an11(modn)a^{n-1} \equiv 1 \pmod n, ne suffit pas : les nombres de Carmichael le passent pour toute base première avec eux. Le plus petit est 561=3×11×17561 = 3 \times 11 \times 17.

Miller-Rabin corrige ce défaut. On écrit n1=2sdn - 1 = 2^s d avec dd impair, et l'on teste si la suite ad,a2d,,a2s1da^d, a^{2d}, \dots, a^{2^{s-1}d} se comporte comme elle le devrait dans un corps, où 11 n'a que deux racines carrées. Pour nn composé, au moins trois quarts des bases sont des témoins de composition ; kk tirages indépendants laissent donc une probabilité d'erreur inférieure à 4k4^{-k}.

Deux précisions honnêtes. La borne 4k4^{-k} est le pire cas ; pour un entier tiré au hasard, l'erreur réelle est très inférieure, et les standards de génération de clés s'en servent pour justifier une poignée de tours seulement. Et un test déterministe polynomial existe depuis 2002 — l'algorithme AKS — mais il est trop lent pour un usage pratique : la cryptographie déployée utilise Miller-Rabin.

Ce qu'on appelle « efficace »

Un dernier point de vocabulaire, sans lequel les énoncés de difficulté n'ont pas de sens. La complexité se mesure en la taille de l'entrée en bits, pas en la valeur de l'entrée. Factoriser nn par divisions successives coûte O(n)O(\sqrt{n}) opérations, soit O(2/2)O(2^{\ell/2}) pour \ell bits : c'est exponentiel en la taille.

ProblèmeMeilleur algorithme connuCoût en fonction de \ell bits
Multiplication, exponentiation modulairescolaire, carréspolynomial
Test de primalitéMiller-Rabinpolynomial
Factorisationcrible algébrique (GNFS)sous-exponentiel, Ln[1/3;1,92]L_n[1/3;\,1{,}92]
Logarithme discret dans Fp\mathbb{F}_p^*calcul d'indicessous-exponentiel, même forme
Logarithme discret sur courbe elliptiquerho de PollardO(2/2)O(2^{\ell/2}), exponentiel

La dernière ligne explique à elle seule le chapitre 11 : aucun algorithme sous-exponentiel n'étant connu sur les courbes, une clé de 256 bits y offre le niveau de sécurité qu'un module RSA de 3072 bits atteint péniblement.

Quiz · 1 question

Pourquoi une implémentation RSA sérieuse revérifie-t-elle sa propre signature avant de la publier ?

  • Pour détecter une clé privée corrompue en mémoireintégrité de la clé
  • Parce qu'une faute pendant le calcul CRT permet de factoriser le module à partir de la signature erronéeattaque par faute
  • Parce que la norme PSS l'exige pour tout signataireexigence normative

Réponse : Le déchiffrement et la signature RSA passent par les restes chinois pour gagner un facteur 4. Si une faute frappe l'une des deux branches, la signature s produite est juste modulo p et fausse modulo q — et pgcd(s^e − m, n) rend p. Une seule signature fautive factorise le module (Boneh, DeMillo, Lipton, 1997). La vérification avant publication coûte une exponentiation avec le petit exposant public : c'est le prix à payer.

Ce que la suite en fait

Chaque outil de ce chapitre a son échéance. L'inverse modulaire produit l'exposant privé de RSA au chapitre 9 ; les corps F28\mathbb{F}_{2^8} portent la boîte S de l'AES au chapitre 4 ; les groupes cycliques et l'ordre des éléments fondent Diffie-Hellman au chapitre 10 ; les restes chinois accélèrent RSA et le fragilisent dans le même mouvement.

Le chapitre 3 marque une rupture de ton : il s'agira d'un seul théorème, celui de Shannon, et de ce qu'il interdit.

À retenir

Flashcards · 3 cartes

Quand un élément a est-il inversible modulo n, et comment trouve-t-on son inverse ?
Exactement quand pgcd(a, n) = 1. L'algorithme d'Euclide étendu donne les coefficients de Bézout au + nv = 1, et u est l'inverse cherché. C'est ainsi que RSA calcule l'exposant privé d = e^(−1) mod φ(n).
Pourquoi le théorème des restes chinois est-il à la fois l'accélérateur et le talon d'Achille de RSA ?
Il permet de déchiffrer modulo p et modulo q séparément, avec des exposants moitié plus courts : environ quatre fois plus rapide. Mais une faute sur une seule des deux branches produit une signature correcte modulo p et fausse modulo q, et pgcd(s^e − m, n) livre alors p. D'où l'obligation de vérifier sa propre signature avant de la publier.
Pourquoi accepte-t-on un test de primalité PROBABILISTE pour engendrer une clé RSA ?
Parce que Miller-Rabin a une probabilité d'erreur inférieure à 4^(−k) pour k tours, et bien moindre encore sur un entier tiré au hasard : quelques tours suffisent à descendre sous le seuil de tout autre risque du système. Le test déterministe AKS existe depuis 2002 mais reste trop lent pour un usage pratique.

QCM de synthèse — Bloc 0 — Socle

Le QCM ci-dessous porte sur l'ensemble du bloc : plusieurs questions relient les leçons entre elles. En cas d'erreur, le bilan indique le chapitre à revoir.

QCM de bloc · 5 questions

Bloc 0 — Socle

1. Un fournisseur refuse de publier son algorithme « pour plus de sécurité ». Quel principe cela viole-t-il, et quel est le risque concret ?

  • Le théorème de Shannon : la clé devient trop courte
  • Le principe de Kerckhoffs : une conception ne se change pas comme une clé, et sa fuite condamne tous les utilisateurs à la fois
  • Aucun : garder l'algorithme secret ajoute une couche gratuite

Réponse : Kerckhoffs exige que toute la sécurité réside dans la clé. Une clé se change ; une conception non — le jour où elle fuit (employé, rétro-ingénierie), le système est perdu définitivement et pour tous. CSS, A5/1, Crypto1 en sont morts. Garder une architecture confidentielle est admissible en défense en profondeur, en DÉPENDRE ne l'est pas.

2. Pourquoi mesure-t-on la complexité d'un problème en nombre de BITS de l'entrée, et non en sa valeur ?

  • Par convention historique, sans conséquence réelle
  • Parce que factoriser n par divisions coûte O(√n) = O(2^(ℓ/2)) : polynomial en la valeur, mais exponentiel en la taille ℓ
  • Parce que les ordinateurs ne manipulent que des bits

Réponse : La sécurité repose sur cet écart. Factoriser par essais successifs est O(√n), ce qui semble modéré — mais n a ℓ ≈ log₂(n) bits, donc √n = 2^(ℓ/2) est exponentiel en la taille de l'entrée. « Efficace » veut dire polynomial en le nombre de bits ; c'est cette échelle qui sépare le calcul facile (exponentiation) du calcul infaisable (factorisation).

3. Le théorème des restes chinois accélère RSA d'un facteur ~4. En quoi ce même mécanisme le met-il en danger ?

  • Il révèle φ(n) à l'attaquant
  • Une faute pendant l'un des deux calculs (mod p, mod q) produit une signature dont le pgcd avec le message factorise n
  • Il rend l'exponentiation non constante en temps

Réponse : En déchiffrant séparément modulo p et modulo q, une faute matérielle sur une seule branche donne une signature juste modulo p et fausse modulo q ; alors pgcd(s^e − m, n) livre p (Boneh-DeMillo-Lipton, 1997). Une seule signature fautive factorise le module — d'où l'obligation de vérifier sa propre signature avant de la publier.

4. On engendre une clé RSA en testant la primalité par Miller-Rabin, un test PROBABILISTE. Pourquoi est-ce acceptable ?

  • Parce qu'une clé RSA n'a pas besoin de vrais premiers
  • Parce que la probabilité d'erreur, inférieure à 4^(−k) pour k tours et bien moindre sur un entier aléatoire, descend sous tout autre risque du système
  • Parce que Miller-Rabin est en réalité déterministe

Réponse : Quelques tours de Miller-Rabin ramènent la probabilité de prendre un composé pour un premier sous 4^(−k), et bien plus bas encore sur un candidat aléatoire — négligeable devant les autres risques. Le test déterministe AKS existe depuis 2002 mais reste trop lent : la pratique utilise Miller-Rabin. Le probabilisme bien maîtrisé est un outil, pas un défaut.

5. Un Diffie-Hellman utilise un générateur g dont l'ordre est un petit diviseur de p−1. Quelle notion du bloc explique l'effondrement ?

  • Le théorème des restes chinois
  • L'ordre d'un élément : g n'engendre qu'un petit sous-groupe, dont l'attaquant énumère toutes les valeurs
  • L'exponentiation rapide, qui devient inutilisable

Réponse : L'ordre de g est le plus petit k tel que g^k = 1, et il divise p−1 (Lagrange). S'il est petit, g n'engendre qu'un sous-groupe réduit : le secret partagé ne prend qu'un petit nombre de valeurs, que l'attaquant essaie toutes. Vérifier l'ordre du générateur est une étape obligatoire — un oubli a produit des vulnérabilités réelles.