Arithmétique modulaire
Ce que ce chapitre apporte6 points
- Maîtriser divisibilité, division euclidienne, pgcd et ppcm.
- Appliquer l'algorithme d'Euclide et sa version étendue, et énoncer le théorème de Bézout.
- Calculer dans les congruences et déterminer un inverse modulaire.
- Reconnaître les nombres premiers, appliquer le crible d'Ératosthène, citer les familles remarquables.
- Utiliser l'indicatrice d'Euler et le petit théorème de Fermat.
- Simplifier une congruence quand c'est permis, et reconnaître quand cela ne l'est pas.
Un message chiffré n'est qu'une suite de nombres. Derrière cette évidence se cache la question qui fonde toute la sécurité informatique : comment fabriquer une opération facile dans un sens et pratiquement impossible dans l'autre ? La réponse ne vient ni de l'analyse ni de la géométrie, mais de l'arithmétique des entiers, celle qu'on croit avoir laissée au collège. Ce chapitre la reprend depuis la divisibilité et installe tout ce dont le chapitre suivant aura besoin.
Il retourne l'outil du chapitre sur la complexité : le coût de calcul y était un ennemi à faire baisser ; il devient ici le rempart sur lequel tout repose.
Pourquoi de l'arithmétique au XXIe siècle
L'objection est naturelle : on dispose des réels, des complexes, des vecteurs, pourquoi revenir aux entiers ?
-
Une machine ne manipule que des entiers. Un « nombre à virgule » est un entier accompagné d'un exposant, sur un nombre fini de bits. En Python,
0.1 + 0.2 == 0.3est faux, et n'a pas d'écriture exacte. Le chapitre Les nombres à virgule le montre bit par bit. -
L'arithmétique est plus difficile que le calcul réel, pas plus simple. Dans , toute équation avec a une solution ; dans , n'en a aucune. Cette contrainte supplémentaire rend l'existence des solutions imprévisible.
-
Cette imprévisibilité est exactement ce qu'on cherche. Elle permet de construire des opérations faciles dans un sens et hors d'atteinte dans l'autre. Cela reste vrai quand l'adversaire connaît la méthode, et même quand il possède une partie de la clé.
Divisibilité et division euclidienne
divise , noté , s'il existe un entier tel que .
Division euclidienne : pour entier et entier non nul, il existe un unique couple tel que avec .
L'unicité du couple est ce qui rend tout le reste possible. En Python, a // b donne et a % b donne : ce sont les opérateurs de division entière et de reste du parcours Python.
-17 // 5 vaut -4 et -17 % 5 vaut 3, ce qui respecte avec . En C ou en Java, -17 % 5 vaut -2 : le langage tronque vers zéro au lieu d'arrondir vers le bas.
En cryptographie, où tout est modulaire, cette différence transforme un chiffrement correct en chiffrement faux. C'est un piège classique du portage d'un algorithme d'un langage à l'autre.
PGCD et algorithme d'Euclide
Le pgcd est le plus grand entier divisant et ; le ppcm le plus petit multiple commun positif. Ils sont liés par .
Deux entiers sont premiers entre eux si leur pgcd vaut 1. Ce n'est pas la même chose qu'être premiers : 8 et 9 sont premiers entre eux, et aucun des deux n'est premier.
Il repose sur une seule observation : . On remplace le couple par un couple plus petit jusqu'à obtenir un reste nul ; le dernier reste non nul est le pgcd.
Cette observation se démontre en trois lignes, et il vaut la peine de les suivre : sans elle, l'algorithme n'est qu'une recette.
Le point de départ est la division euclidienne , récrite .
Soit un diviseur commun à et à . Il divise alors , c'est-à-dire : tout diviseur commun de et est aussi un diviseur commun de et .
Réciproquement, soit un diviseur commun à et à . Il divise , c'est-à-dire : tout diviseur commun de et est aussi un diviseur commun de et .
Les deux couples ont donc exactement les mêmes diviseurs communs, et en particulier le même plus grand. Remplacer par ne perd rien, et fait strictement décroître le second terme : c'est ce qui garantit à la fois la justesse et la terminaison.
C'est un des plus vieux algorithmes connus, et il reste remarquablement rapide : le nombre de divisions est en , c'est-à-dire proportionnel au nombre de chiffres. La notation est celle de l'analyse d'algorithmes, abordée dans le parcours Algorithmique. Sur des nombres de 600 chiffres, l'algorithme pose un peu plus d'un millier de divisions et termine en une fraction de milliseconde.
Euclide étendu et Bézout
Pour tous entiers et non nuls, il existe des entiers et tels que :
En clair : le pgcd de deux entiers se fabrique toujours en les combinant, chacun multiplié par un entier bien choisi. et sont ces deux multiplicateurs, appelés coefficients de Bézout, et rien n'oblige qu'ils soient positifs.
En particulier, et sont premiers entre eux si et seulement si il existe et avec .
L'algorithme d'Euclide étendu calcule ce couple en même temps que le pgcd. Ce n'est pas une curiosité théorique : c'est exactement ce qui permettra de calculer une clé privée RSA.
Le code ci-dessous le fait en trois lignes, mais il faut savoir le dérouler à la main. C'est le seul moyen de comprendre d'où sortent et , et ce calcul revient dans tout le chapitre.
Descendre. Poser les divisions euclidiennes successives, chacune sous la forme dividende = diviseur × quotient + reste, jusqu'à un reste nul. Le dernier reste non nul est le pgcd.
Remonter. Partir de la ligne qui donne ce pgcd, isolé à gauche. Puis, ligne après ligne en remontant, remplacer chaque reste par son expression tirée de la ligne du dessus. À la fin il ne reste que et , et leurs coefficients sont et .
Ce couple n'est pas choisi au hasard : sera l'exposant public et la valeur de dans l'exemple RSA du chapitre suivant.
La figure ci-dessous pose les deux moitiés côte à côte. Cliquer sur une ligne de la descente montre l'étape de remontée qui la consomme. Il y en a exactement une par ligne, ce qui ne saute pas aux yeux quand les deux moitiés sont recopiées l'une sous l'autre.
La descentediviser jusqu'à un reste nul
| 3120 | = | 17 × 183 | + | 9 |
| 17 | = | 9 × 1 | + | 8 |
| 9 | = | 8 × 1 | + | 1 |
| 8 | = | 1 × 8 | + | 0 |
Dernier reste non nul : 1. Les deux nombres sont premiers entre eux.
La remontéeune étape par ligne, du bas vers le haut
Substituer le reste de la ligne du dessus revient à (α, β) ← (β, α − β × q) avec q = 183. Toute la remontée tient dans cette règle.
Bézout. 3120 × 2 + 17 × -367 = 1contrôle : 1 = 1 ✓
Inverse modulaire. Le coefficient de 17 vaut -367, ramené dans [0 ; 3119] il donne 17⁻¹ ≡ 2753 [3120]contrôle : 17 × 2753 = 46801 ≡ 1
La descente pose quatre divisions et s'arrête sur un reste nul. Le dernier reste non nul vaut : les deux nombres sont premiers entre eux, et Bézout garantit donc l'existence de et .
La remontée repart de la ligne qui isole ce , puis substitue à chaque étape le reste de la ligne du dessus :
, d'où
, d'où
Le résultat. . Donc et .
Et comme , l'inverse de modulo vaut . Ce nombre réapparaîtra tel quel comme clé privée.
Sur la ligne courante, le pgcd s'écrit . Remonter d'une ligne revient alors à une seule substitution, dont le résultat tient en une récurrence :
où est le quotient de la ligne du dessus. Sur l'exemple, la ligne donne , soit , puis , puis . C'est cette règle qu'affiche la figure à chaque étape, et c'est elle qui rend la remontée refaisable de tête.
La remontée produit presque toujours un ou un négatif. L'un des deux au moins doit l'être dès que et sont positifs : deux termes positifs ne peuvent pas totaliser 1 quand chacun dépasse déjà 1.
Le réflexe est donc de ramener le coefficient utile dans l'intervalle par un final, comme ci-dessus avec . En Python, % le fait déjà : -367 % 3120 vaut bien 2753, là où le % du C rendrait -367.
Reprendre la figure ci-dessus et y saisir et : le pgcd vaut , la ligne d'inverse disparaît, et le bloc explique pourquoi. Puis et : le pgcd vaut alors qu'aucun des deux n'est premier.
C'est la distinction qui coûte le plus cher dans ce chapitre. Premier est une propriété d'un nombre seul ; premiers entre eux est une propriété d'un couple. RSA exige la seconde de son exposant public, pas la première.
Une fois et trouvés, recalculer et vérifier que le résultat est le pgcd. Une erreur de signe ou de quotient se voit immédiatement, alors qu'elle se propagerait sans bruit jusqu'à une clé privée fausse.
Congruences : calculer modulo
Beaucoup de questions ne demandent pas un résultat, seulement un reste. L'heure qu'il sera dans 50 heures, le jour de la semaine dans 100 jours, la case d'une table de hachage, la lettre obtenue après un décalage de l'alphabet. Dans tous ces cas, le quotient ne sert à rien. Calculer le résultat exact puis prendre son reste est un détour coûteux. Les congruences sont le langage qui permet de travailler directement sur les restes, sans jamais quitter les petits nombres.
(« congru à modulo ») signifie que divise , autrement dit que et ont le même reste dans la division par .
La notation se lit à voix haute en deux morceaux : le symbole se dit « est congru à », et le se dit « modulo ». Ce porte sur toute l'égalité, jamais sur le seul membre de droite. D'autres ouvrages écrivent : c'est la même chose.
Ce que la définition écarte : n'est pas . Deux nombres congrus restent deux nombres différents, et rien n'autorise à remplacer l'un par l'autre hors d'un calcul modulo .
Travailler modulo , c'est compter sur une horloge : passé , on revient à zéro. Toute l'étrangeté de l'arithmétique modulaire vient de là, et elle cesse d'être étrange dès qu'on voit le cercle.
Ce qu'il faut y voir : une case du cadran ne porte pas un nombre, elle porte une infinité de nombres, ceux qui laissent le même reste. La vérification tient en deux soustractions : et , tous deux multiples de 26. Une congruence se contrôle toujours ainsi, en soustrayant.
La congruence est compatible avec l'addition et la multiplication : si et , alors et . On peut donc réduire à chaque étape d'un calcul, ce qui évite de manipuler des nombres gigantesques.
Modulo 6 : . Ni 2 ni 3 n'est nul, et pourtant leur produit l'est. On ne peut donc pas « simplifier par 2 » comme on le ferait dans .
Ce phénomène disparaît quand est premier : modulo un nombre premier, tout élément non nul est inversible et le produit de deux non-nuls n'est jamais nul. C'est la raison profonde pour laquelle la cryptographie travaille modulo des nombres premiers, ou modulo un produit de deux premiers dont elle contrôle la structure.
L'inverse modulaire
L'inverse de modulo est l'entier tel que . Il existe si et seulement si , et on l'obtient par Euclide étendu : de on tire , donc .
La ligne du milieu, celle qu'on saute souvent : dans , le terme est un multiple de , donc il vaut 0 modulo . Il ne reste que , ce qui est la définition de l'inverse. Le coefficient de Bézout est l'inverse, à un modulo près pour le ramener dans .
Cette condition sur le pgcd n'est pas une clause technique : elle se voit. Avancer de en sur le cadran revient à parcourir les multiples de , et deux cas seulement se présentent.
Ce qu'il faut suivre du regard, c'est le tracé : tant qu'il n'est pas refermé, il reste des cases à visiter. Le second cas est l'exact opposé, avec un pas qui partage un diviseur avec 26.
Le tracé se referme immédiatement, et la case 1 n'a jamais été touchée : c'est cela, ne pas être inversible. Une case jamais atteinte, c'est une information définitivement perdue.
Le pas de visite exactement cases. Il fait donc le tour complet, et n'atteint le 1, que si ce pgcd vaut 1. C'est la même condition que celle du théorème, vue depuis le cercle plutôt que depuis Bézout.
Vérification
1.Deux nombres premiers entre eux sont…
2.Le théorème de Bézout garantit l'existence de u et v tels que au + bv = pgcd(a, b). À quoi cela sert-il concrètement ?
3.La remontée d'Euclide produit presque toujours un coefficient négatif. Est-ce une erreur ?
4.Calculer a mod n quand a est négatif, en Python et en C, donne…
Nombres premiers
Un entier est premier s'il admet exactement deux diviseurs positifs distincts : 1 et lui-même.
Il n'a qu'un seul diviseur, pas deux. Surtout, l'admettre détruirait le théorème fondamental de l'arithmétique : tout entier se décompose de façon unique en produit de facteurs premiers. Si 1 était premier, donnerait une infinité de décompositions. C'est l'unicité qui compte, et c'est elle qu'on protège.
Le crible d'Ératosthène
Pour lister tous les premiers jusqu'à : on écrit les entiers de 2 à , on garde le plus petit non barré, on barre tous ses multiples, on recommence. On peut s'arrêter dès que le carré du candidat dépasse .
Familles remarquables
Mersenne : . Pour que soit premier, il faut que le soit, mais cela ne suffit pas : . Les plus grands premiers connus sont des nombres de Mersenne, parce qu'il existe un test de primalité spécifique et très rapide pour cette forme.
Fermat : . Fermat conjecturait qu'ils étaient tous premiers ; c'est vrai pour à (3, 5, 17, 257, 65537), et Euler a réfuté la conjecture en factorisant .
Sophie Germain : est un premier de Sophie Germain si est aussi premier. Les premiers sont 2, 3, 5, 11, 23, 29, 41… Ils sont recherchés en cryptographie parce qu'ils produisent des groupes à la structure bien maîtrisée.
Presque jamais. Si est premier, alors est nécessairement une puissance de 2, c'est-à-dire qu'on est dans la famille de Fermat. Et même là, on ne connaît que cinq nombres de Fermat premiers, ceux que Fermat connaissait déjà : à .
La raison est algébrique : si a un facteur impair , alors divise . Exemple : , avec .
Factoriser est difficile, et tout repose là-dessus
Multiplier deux nombres premiers de 300 chiffres prend une fraction de microseconde. Retrouver ces deux facteurs à partir du produit est, à ce jour, hors de portée de toute machine existante.
C'est l'asymétrie fondamentale sur laquelle RSA est bâti : une opération immédiate dans un sens, sans méthode praticable dans l'autre.
Il n'est pas démontré que factoriser est intrinsèquement difficile : c'est une difficulté constatée, pas prouvée. Un algorithme efficace pourrait exister et n'avoir pas été trouvé, c'est le sens de la question « un nouveau théorème pourrait-il ruiner l'économie mondiale ? ».
On sait en revanche que l'algorithme de Shor factorise en temps polynomial sur un ordinateur quantique. La menace n'est pas théorique, elle est technologique, et elle motive la cryptographie post-quantique, qui repose sur d'autres problèmes difficiles, pas sur la factorisation.
Euler et Fermat
La section sur l'inverse modulaire a laissé une question ouverte. Un élément est inversible modulo quand son pgcd avec vaut 1 : combien y en a-t-il ? La réponse détermine le nombre d'exposants publics utilisables dans RSA, et elle porte un nom.
est le nombre d'entiers de 1 à premiers avec .
- si est premier ;
- si et sont deux premiers distincts.
La lettre se lit « phi », et se dit « phi de ». Elle compte donc les entiers de l'intervalle dont le pgcd avec vaut 1, c'est-à-dire exactement les éléments inversibles modulo . Sur : les candidats sont 1, 5, 7 et 11, et aucun autre, car tous les autres partagent un 2 ou un 3 avec 12. Donc .
La première égalité est immédiate : si est premier, tous les entiers de 1 à lui sont premiers, et seul ne l'est pas.
La seconde se compte, et ce décompte mérite d'être fait une fois, parce que c'est lui qui fixe la taille de l'espace des clés RSA.
Parmi les entiers de 1 à , un entier n'est pas premier avec exactement lorsqu'il est multiple de ou multiple de . Il y a multiples de (à savoir ) et multiples de . Le seul entier compté deux fois est lui-même, qui est multiple des deux.
Le nombre d'entiers à retirer vaut donc , et il reste
C'est toute la sécurité de RSA en une phrase. Calculer demande la factorisation de ; sans elle, il n'existe aucun raccourci connu. Un attaquant qui obtiendrait par un autre moyen calculerait la clé privée en une ligne, par Euclide étendu.
Petit théorème de Fermat : si est premier et ne divise pas , alors .
Théorème d'Euler, qui le généralise : si , alors .
En clair : élever un nombre à la puissance ramène toujours à 1, à la seule condition que ce nombre n'ait aucun facteur commun avec . C'est une remise à zéro garantie. Dépasser cet exposant ne fait que recommencer le même tour, ce qui revient à dire que seul le reste de l'exposant modulo compte.
C'est ce second théorème, et lui seul, qui fait fonctionner RSA : c'est lui qui fera disparaître le facteur parasite au moment du déchiffrement.
On rencontre cette formule dans des corrigés de RSA, et elle y est fausse par construction. Si était premier, serait calculable par tout le monde ; la clé privée s'en déduirait immédiatement, et le chiffrement n'aurait aucun intérêt.
Toute la sécurité de RSA tient à ce que exige de connaître et , donc de savoir factoriser .
L'exponentiation modulaire rapide
Calculer avec de 600 chiffres semble impossible. Ça ne l'est pas, grâce à une idée simple : élever au carré plutôt que multiplier une fois de plus.
Pour , l'écriture binaire de l'exposant, , donne . Trois élévations au carré successives fournissent , et , puis deux multiplications les assemblent : cinq multiplications au lieu de douze. L'écart devient vertigineux sur un grand exposant, dont le coût ne croît plus qu'avec le nombre de chiffres.
Le même calcul en entier, avec les nombres du RSA de la fin du chapitre : . L'exposant s'écrit , donc . Quatre élévations au carré suffisent, chacune réduite modulo 3233 avant la suivante :
, puis , puis , puis . Donc .
Il ne reste qu'une multiplication : , d'où . Cinq opérations au total, et aucun nombre intermédiaire de plus de sept chiffres, alors que écrit en entier en compterait trente et un. Réduire à chaque étape est ce qui rend le calcul possible.
À calculer soi-même
L'arithmétique modulaire se vérifie par le calcul, et chaque étape tient sur une ligne. La faire une fois dispense de croire les formules sur parole.
Divisions, pgcd et congruences
- 1.
La division euclidienne de 247 par 13 donne quel quotient ?
- 2.
Quel reste donne-t-elle ?
- 3.
Combien vaut le pgcd de 252 et 198 ?
- 4.
Combien vaut , c'est-à-dire le nombre d'entiers de 1 à 12 premiers avec 12 ?
- 5.
Combien vaut modulo 11 ? Le petit théorème de Fermat donne la réponse sans calculer la puissance.
- 6.
Pour calculer par élévations au carré, l'exposant s'écrit en binaire 1101. Combien d'opérations cela demande-t-il au total ?
- 7.
Un calcul naïf de demanderait combien de multiplications ?
Les deux dernières réponses donnent la mesure de l'exponentiation rapide sur un petit exposant. Sur un exposant de six cents chiffres, comme ceux de la cryptographie, le calcul naïf demanderait plus d'opérations qu'il n'y a d'atomes dans l'univers, et la méthode par carrés en demande quelques milliers.
Où la démarche dérape
Une simplification parfaitement légitime sur les entiers, et fausse modulo un composé.
Une simplification qui ne passe pas modulo 12
Une seule étape est fausse. Désigner laquelle.
On sait que , et l'on cherche la valeur de modulo 12.
Exercices type
Pourquoi 1 n'est-il pas considéré comme un nombre premier ?
Parce que l'unicité de la décomposition en facteurs premiers en dépend. Si 1 était premier, s'écrirait , mais aussi , et : la décomposition cesserait d'être unique.
Ce n'est donc pas une convention arbitraire, c'est le prix à payer pour garder un théorème qui sert partout ailleurs.
Jusqu'où faut-il aller pour vérifier qu'un nombre est premier ?
Jusqu'à , et pas plus loin. Si admet un diviseur supérieur à , alors est un diviseur inférieur à , et il aurait déjà été trouvé.
Le gain est considérable : vérifier un nombre de six chiffres demande mille essais au lieu d'un million.
Un inverse modulaire existe-t-il toujours ?
Non. L'inverse de modulo existe si et seulement si .
La raison se lit sur Bézout : cette condition équivaut à l'existence de et tels que , ce qui donne exactement . L'algorithme d'Euclide étendu ne fait donc pas que répondre oui ou non : il construit l'inverse.
Pourquoi réduire à chaque étape plutôt qu'à la fin ?
Parce que les congruences sont compatibles avec l'addition et la multiplication : réduire en cours de route donne le même résultat que réduire à la fin.
La différence est de taille des nombres manipulés. Calculer en entier produit un nombre de quatre-vingt-cinq chiffres ; le calculer modulo 11 en réduisant à chaque étape ne fait jamais dépasser deux chiffres.
La méthode
- Écrire la division euclidienne sous la forme avec . Toutes les erreurs de signe viennent de son oubli.
- Poser Euclide en colonnes, une division par ligne. Le dernier reste non nul est le pgcd.
- Pour Bézout, remonter les égalités une à une, en substituant les restes sans développer les produits : c'est ce qui rend le calcul faisable à la main.
- Réduire à chaque étape dans un calcul modulaire. Ne jamais développer une grande puissance.
- Vérifier qu'un facteur est inversible avant de le simplifier dans une congruence. Il ne l'est que s'il est premier avec le module.
- Pour une puissance modulaire, procéder par carrés successifs en suivant l'écriture binaire de l'exposant.
Synthèse
- Division euclidienne : avec , et ce couple est unique. Attention au signe du reste selon le langage employé.
- Euclide : , en . Sa version étendue donne et tels que .
- Bézout : et sont premiers entre eux si et seulement s'il existe et tels que .
- Congruences : compatibles avec l'addition et la multiplication, donc on réduit à chaque étape.
- Un facteur ne se simplifie que s'il est premier avec le module. Sinon la congruence a plusieurs solutions.
- Modulo un composé, un produit de non-nuls peut être nul. Modulo un premier, jamais.
- 1 n'est pas premier : l'unicité de la décomposition en dépend.
- Crible d'Ératosthène : barrer les multiples à partir de , s'arrêter à .
- Factoriser est difficile : constaté, pas démontré.
- et , jamais pour un composé.
- Euler : dès que .
- Exponentiation rapide : carrés successifs, multiplications au lieu de .
Et ensuite
Toute cette arithmétique a été construite pour servir, et elle sert à une chose précise : rendre facile dans un sens ce qui est impraticable dans l'autre. Cryptographie exploite cette asymétrie.
Mettre en pratique
Euclide et Bézout, inverse modulaire, crible d'Ératosthène et exponentiation rapide.
- Le pgcd par l'algorithme d'EuclideNiveau 1
- L'inverse modulaireNiveau 3
- Le crible d'ÉratosthèneNiveau 2
- Débogage : le crible garde 0 et 1Niveau 2
- L'exponentiation modulaire rapideNiveau 3
- Démasquer un octet de micrologicielNiveau 2