Académique Documents
Professionnel Documents
Culture Documents
Guilhem Castagnos
I Introduction à la cryptographie 1
1 Vocabulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2 Historique (non exhaustif) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
3 Sécurité du chiffrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
4 Quelques Fonctionnalités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
5 Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
II Notions de complexité 5
1 Sens unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Complexité algorithmique élémentaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Complexité des algorithmes de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4 Exponentiation modulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
– ii –
Chapitre I
Introduction à la cryptographie
1. Vocabulaire
Cryptographie : ensemble de méthodes pour sécuriser l’information et les communications numé-
riques contre des adversaires.
Cryptanalyse : consiste à casser ces méthodes (attaques), alors que la cryptographie consiste à les
concevoir.
Cryptologie = Cryptographie + Cryptanalyse. En pratique, on emploie souvent le terme cryptographie
à la place de cryptologie.
Lorsque l’on transforme l’information de manière à la rendre inintelligible pour un adversaire, on parle
de chiffrer l’information (le procédé est le chiffrement). Le destinataire légitime déchiffre ensuite
(déchiffrement). On dit qu’un adversaire qui réussirait à casser le système de chiffrement décrypte. Les
termes « crypter », « cryptage » ne sont pas corrects.
D’autre part les mots coder et décoder correspondent à une autre problématique : celle de protéger l’in-
formation contre les modifications que pourraient apporter le bruit qui intervient lors de sa transmission.
Les codes correcteurs d’erreurs sont utilisés pour cela, il n’y a pas ici de notion de secret, tout le monde
même un adversaire peut décoder.
–1–
Chapitre I : Introduction à la cryptographie
• Le chiffrement par blocs. Comme pour le chiffrement de Vigenère, le message clair est découpé
en blocs de ℓ bits. À une clef secrète 𝑘, une chaîne de bits aléatoire d’une certaine longueur, on fait
correspondre une permutation σ𝑘 de {0, 1}ℓ : la description de cette correspondance correspond à la
description de l’algorithme de chiffrement. La fonction de chiffrement est alors 𝑚 ↦ σ𝑘 (𝑚). Tout
l’enjeu est de produire une permutation σ𝑘 la plus « aléatoire » possible tout en gardant une certaine
structure pour avoir un algorithme de longueur succincte (décrire une permutation sans structure
quelconque se fait en donnant la liste de ses images ici 2ℓ × ℓ bits).
Les standards successifs sont le DES pour Data Encryption Standard de 1977 à 2000, qui utilise une
clef 𝑘 de 56 bits et ℓ = 64, maintenant obsolète à cause de sa petite taille de clef ; puis l’AES pour
Advanced Encryption Standard depuis 2000, qui utilise une clef de 128, 192 ou 256 bits et ℓ = 128. Cet
algorithme est massivement utilisé aujourd’hui (4G, 5G, WPA pour le Wifi, TLS/SSL pour le Web).
–2–
3. Sécurité du chiffrement
• Le chiffrement à flot est une version pratique du chiffrement de Vernam. À partir d’une clef se-
crète, une chaîne de bits aléatoire d’une certaine longueur, on crée de manière déterministe une suite
(pseudo-aléatoire) de bits (𝑧𝑘 )𝑘∈𝐍 . Puis on chiffre une suite de bits (𝑚𝑘 )𝑘∈𝐍 par 𝑐𝑘 = 𝑚𝑘 + 𝑧𝑘 mod 2
pour tout 𝑘 ∈ 𝐍. On perd cependant le caractère parfait du chiffrement de Vernam car la suite de
bits est pseudo-aléatoire. Exemple : RC4 (1987), SNOW3G (2002), ChaCha20 (2008)
Tous ces algorithmes de chiffrement à clef secrète sont sensibles à la recherche exhaustive. Connais-
sant un message clair 𝑚 et son chiffré correspondant 𝑐, on calcule le chiffrement de 𝑚 par toutes les clefs
possibles jusqu’à trouver 𝑐. Si la clef secrète fait 𝑛 bits, on doit donc faire 2𝑛 chiffrements dans le cas le pire.
Pour le DES où 𝑛 = 56 ceci se fait maintenant en quelques heures en utilisant un matériel peu onéreux.
Le but du cryptographe symétrique est de concevoir un système dont la meilleure attaque connue soit la
recherche exhaustive.
Le principal problème pratique de ces algorithmes est le suivant : pour communiquer de manière sécuri-
sée, Alice et Bob doivent tous les deux connaître la clef secrète 𝑘 et donc se l’être communiquée de manière
sûre, par exemple en main propre. On parle d’échange de clef. Ceci ne posait pas trop de problème pour
les applications militaires, mais est impensable pour des applications civiles telle que le chiffrement des
communications Web.
Diffie-Hellman (1976)
Ces deux chercheurs conceptualisent la cryptographie asymétrique ou cryptographie à clef pu-
blique qui résout ce problème. Ils proposent aussi un protocole interactif d’échange de clef, qui porte leur
nom. Ce procédé permet à Alice et Bob d’échanger publiquement des informations et à la fin du protocole
de connaître une quantité qui pourra servir comme clef secrète pour faire du chiffrement symétrique : on
souhaite qu’un adversaire Oscar qui écoute la conversation entre Alice et Bob n’ait aucune information sur
cette clef.
3. Sécurité du chiffrement
Que ce soit en clef secrète ou en clef publique, on définit la sécurité en définissant un adversaire : ses
buts et ses moyens.
Buts de l’adversaire
• Bris total : retrouver la clef secrète ou privée (but le plus fort)
• Casser la notion de sens unique : étant donné un chiffré 𝑐 ; retrouver le message clair 𝑚 ;
• Casser la notion de sécurité sémantique : étant donné un chiffré 𝑐 retrouver une information sur
le message clair 𝑚 (but le plus faible).
–3–
Chapitre I : Introduction à la cryptographie
Moyens de l’adversaire
On a, par ordre décroissant de difficulté pour l’adversaire :
• l’attaque à chiffré(s) seul(s) : l’adversaire ne connaît que le chiffré ( moyen le plus faible) ;
• l’attaque à clair(s) choisi(s) : semblable à la précédente, mais pour laquelle l’adversaire peut choi-
sir les clairs
Notions de sécurité
En combinant moyens et buts on définit plusieurs notions de sécurité plus ou moins fortes : par exemple
un chiffrement sera résistant à une attaque contre le bris total un utilisant des chiffrés seuls (sécurité la
plus basse on ne résiste qu’à l’attaque la plus difficile) ou un chiffrement sera résistant à une attaque contre
la sécurité sémantique pour une attaque à chiffrés choisis (sécurité la plus haute).
En asymétrique, le moyen minimal que l’on considère est l’attaque à clairs choisis. La clef publique
étant connue, un adversaire peut obtenir les chiffrés des messages clairs de son choix.
En symétrique, on considère souvent comme moyen minimal l’attaque à clair(s) connus(s) : entête de
fichier connu (mail, image jpeg…), début de protocole.
4. Quelques Fonctionnalités
• confidentialité de l’information
• intégrité de l’information : un adversaire ne peut la modifier sans que cela soit détecté.
• authentification : prouve l’identité de l’auteur d’un message, permet aussi le contrôle d’accès
5. Bibliographie
• Douglas Stinson, Cryptographie : Théorie et pratique, 2003 (également des éditions plus récentes en
anglais).
–4–
Chapitre II
Notions de complexité
1. Sens unique
Les algorithmes de chiffrement asymétriques reposent sur la notion de fonctions à sens unique.
Intuitivement, il s’agit de fonctions faciles à évaluer (il existe un algorithme efficace qui fait cela) mais
difficile à inverser.
Dans la suite du cours, nous traiterons deux exemples.
RSA
Soit N = 𝑝𝑞 où 𝑝 et 𝑞 sont deux grands nombres premiers distincts. Soit 1 < 𝑒 < N un entier.
Étant donné un entier 𝑥 ∈ 𝐙/N𝐙 nous verrons qu’il est facile de calculer 𝑦 = 𝑥𝑒 mod N. Par contre,
étant donné 𝑦 il est difficile de retrouver 𝑥 (on ne connaît pas d’algorithme efficace qui le fait).
Logarithme discret
Soit (G, ×) un groupe cyclique d’ordre 𝑛 et 𝑔 un générateur. G = {𝑔, 𝑔2 , … , 𝑔𝑛−1 , 𝑔𝑛 = 1}.
S’il est facile de calculer dans G, il sera facile de calculer ℎ = 𝑔𝑥 étant donné 𝑥. Par contre étant donné
ℎ, dans certains groupes il est difficile de retrouver 𝑥, c’est le problème du logarithme discret, 𝑥 = log𝑔 (ℎ).
On a utilisé « facile » pour « il existe un algorithme efficace » et « difficile » pour « on ne connaît pas
d’algorithme efficace ». Pour donner une définition plus rigoureuse, on va voir des notions de complexité
algorithmique.
La complexité d’un algorithme est l’ordre de grandeur du nombre d’opérations binaires effectuées dans
le cas le pire, en fonction de 𝑛.
On dit qu’un algorithme est en 𝒪 (𝑓(𝑛)) s’il existe des entiers 𝑛0 et M tels que son nombre d’opérations
binaires est ⩽ M𝑓(𝑛) pour 𝑛 ⩾ 𝑛0 . Cette notion de complexité permet donc de comparer et classifier des
algorithmes asymptotiquement.
Complexité polynomiale
Si 𝑓 est un polynôme. Ce sont les algorithmes efficaces correspondant à des problèmes algorithmiques
faciles ! Exemple : additions, multiplications d’entiers de taille 𝑛 (voir plus bas)…
Complexités courantes :
–5–
Chapitre II : Notions de complexité
Complexité exponentielle
Algorithmes en 𝒪 (2𝑐𝑛 ) pour un entier 𝑐. Par exemple la recherche exhaustive d’une clef de 𝑛 bits effec-
tue 𝒪 (2𝑛 ) chiffrements.
Pour résumer, une attaque avec complexité polynomiale (en la taille de la clef, ou en un paramètre de
sécurité dont dépend la taille de la clef) sur un système cryptographique correspondra donc à une attaque
efficace et le système sera considéré cassé et donc non sûr. Par contre une complexité exponentielle (ou
sous-exponentielle) permettra d’ajuster la taille de la clef pour rendre l’attaque inenvisageable tout en gar-
dant un système possible à utiliser. Ainsi pour une complexité polynomiale en 𝒪 (𝑛𝑘 ), doubler la taille de
la clef 𝑛, multipliera le coût de l’attaque uniquement par 2𝑘 alors que pour une complexité exponentielle
en 𝒪 (2𝑛 ), doubler la taille de la clef mettra au carré le coût de l’attaque.
4. Exponentiation modulaire
On désire calculer 𝑥𝑎 mod N avec 𝑥, 𝑎 < N et N de 𝑛 bits. Calcul usuel en cryptographie.
Le calcul 𝑥 × 𝑥 × ⋯ × 𝑥 est trop coûteux : 𝑎 − 1 multiplications, c’est à dire 𝒪 (2𝑛 ) multiplications, donc
une complexité exponentielle.
–6–
4. Exponentiation modulaire
On utilise un algorithme bien plus efficace (appelé exponentiation rapide ou exponentiation binaire)
ℓ−1
en décomposant le calcul en utilisant la représentation binaire de 𝑎 = ∑𝑖=0 𝑎𝑖 2𝑖 .
On note 𝑏ℓ = 0, puis
𝑏ℓ−𝑖 = 2𝑏ℓ−𝑖+1 + 𝑎ℓ−𝑖 ,
pour 𝑖 = 1, … , ℓ de telle sorte que 𝑏0 = 𝑎. On calcule ensuite 𝑥𝑎 mod N itérativement : 𝑥𝑏ℓ = 1 puis
Du fait de sa structure, cet algorithme est appelé square and multiply en anglais. On a considéré ici une
variante de « gauche à droite » : des bits de poids forts de l’exposant 𝑎 aux bits de poids faibles. Il existe
une version de « droite à gauche » de complexité similaire et de nombreuses variantes et optimisations.
Cette version utilise dans le cas le pire 2ℓ multiplications modulo N (3/2ℓ en moyenne). Comme ℓ ⩽ 𝑛
et en utilisant les multiplications et divisions euclidiennes naïves on obtient un algorithme en 𝒪 (𝑛3 ).
–7–
Chapitre II : Notions de complexité
–8–
Chapitre III
Rappels d’arithmétique
• Diviseurs. On dit que 𝑏 divise 𝑎 s’il existe un entier 𝑞 tel que 𝑎 = 𝑏𝑞. On note 𝑏|𝑎.
• Plus grand diviseur commun de 𝑎 et 𝑏 avec (𝑎, 𝑏) ≠ (0, 0) : le plus grand entier 𝑑 tel que 𝑑|𝑎 et 𝑑|𝑏.
On notera pgcd(𝑎, 𝑏). De plus si 𝑢|𝑎 et 𝑢|𝑏 alors 𝑢| pgcd(𝑎, 𝑏).
• Nombres premiers. Un entier naturel 𝑝 est dit premier si 𝑝 > 1 et l’ensemble de ses diviseurs est
{1, 𝑝}. Il existe une infinité de nombres premiers.
• Factorisation. Tout entier naturel 𝑛 non nul se factorise de manière unique (à l’ordre près) en
produit de puissances de nombres premiers :
𝑛= 𝑝𝑛𝑝 avec 𝑛𝑝 ⩾ 0.
𝑝 premiers
–9–
Chapitre III : Rappels d’arithmétique
Montrons que cet algorithme retourne le résultat attendu. On note (𝑟𝑛 )𝑛∈𝐍 la suite des restes successifs,
avec l’initialisation 𝑟0 = 𝑎, 𝑟1 = 𝑏. De même (𝑞𝑛 )𝑛⩾1 désigne la la suite des quotients. À chaque étape, on
fait la division euclidienne 𝑟𝑛−1 = 𝑞𝑛 𝑟𝑛 + 𝑟𝑛+1 de sorte que 𝑟𝑛+1 = 𝑟𝑛−1 − 𝑞𝑛 𝑟𝑛 . On note 𝑘 tel que 𝑟𝑘 soit le
dernier reste non nul. On a pgcd(𝑎, 𝑏) = pgcd(𝑟0 , 𝑟1 ) = pgcd(𝑟1 , 𝑟2 ) = ⋯ = pgcd(𝑟𝑘 , 0) = 𝑟𝑘 .
𝑢 𝑣0 1 0
On note (𝑢𝑛 )𝑛∈𝐍 , (𝑣𝑛 )𝑛∈𝐍 les suites des coefficients 𝑢 et 𝑣 avec l’initialisation 0 = . Sous
𝑢1 𝑣1 0 1
forme matricielle chaque étape correspond à
𝑟𝑛 0 1 𝑟𝑛−1
𝑟 = 1 −𝑞𝑛 𝑟𝑛
⋅
𝑛+1
De même,
𝑢𝑛 𝑣𝑛 0 1 𝑢𝑛−1 𝑣𝑛−1
𝑢 = ⋅
𝑛+1 𝑣𝑛+1 1 −𝑞𝑛 𝑢𝑛 𝑣𝑛
Par conséquent,
𝑢𝑛 𝑣𝑛 0 1 0 1 𝑢0 𝑣0 0 1 0 1
𝑢 = ⋯ = ⋯ .
𝑛+1 𝑣𝑛+1 1 −𝑞𝑛 1 −𝑞1 𝑢1 𝑣1 1 −𝑞𝑛 1 −𝑞1
En déroulant l’identité sur les restes, on obtient donc que
𝑟𝑛 𝑢𝑛 𝑣𝑛 𝑟0 𝑢𝑛 𝑣𝑛 𝑎
𝑟 = 𝑢 =
𝑣𝑛+1 𝑟1 𝑢𝑛+1 𝑣𝑛+1 𝑏
⋅
𝑛+1 𝑛+1
𝑟𝑘 𝑢𝑘 𝑣𝑘 𝑎
0 = 𝑢 𝑣𝑘+1 𝑏
⋅
𝑘+1
Donc pgcd(𝑎, 𝑏) = 𝑟𝑘 = 𝑎𝑢𝑘 + 𝑏𝑣𝑘 .
3. L’anneau 𝐙/𝑛𝐙
Soit 𝑛 ⩾ 2 un entier naturel. Soit 𝑎, 𝑏 ∈ 𝐙, 𝑎 ≡ 𝑏 (mod 𝑛) si et seulement si 𝑎 − 𝑏 est un multiple de
𝑛. Ceci donne une relation d’équivalence et on note 𝐙/𝑛𝐙 l’ensemble des entiers modulo 𝑛, 𝐙/𝑛𝐙 = {0
(mod 𝑛), 1 (mod 𝑛), … , 𝑛 − 1 (mod 𝑛)}.
L’addition et la multiplication dans 𝐙 sont compatibles avec la relation d’équivalence et on définit les
opérations dans 𝐙/𝑛𝐙 par 𝑎 (mod 𝑛) + 𝑏 (mod 𝑛) = (𝑎 + 𝑏) (mod 𝑛) de même, 𝑎 (mod 𝑛) × 𝑏 (mod 𝑛) =
(𝑎 × 𝑏) (mod 𝑛). Par conséquent, (𝐙/𝑛𝐙, +, ×) est un anneau commutatif. On note alors les classes et les
opérations plus simplement par 𝑎𝑏 (mod 𝑛), ou encore 𝑎𝑏 dans 𝐙/𝑛𝐙.
– 10 –
3. L’anneau 𝐙/𝑛𝐙
Inversibles
Définition III – 1. On dit que 𝑎 ∈ 𝐙 est inversible modulo 𝑛 s’il existe 𝑏 ∈ 𝐙 tel que 𝑎𝑏 ≡ 1 (mod 𝑛). C’est à
×
dire que 𝑎 (mod 𝑛) ∈ (𝐙/𝑛𝐙) . On notera 𝑎−1 ≡ 𝑏 (mod 𝑛) ou 𝑎−1 = 𝑏 dans 𝐙/𝑛𝐙.
Proposition III – 2. Caractérisation des inversibles
1. Un entier 𝑎 est inversible modulo 𝑛 si et seulement si pgcd(𝑎, 𝑛) = 1. De plus si 1 = 𝑎𝑢 + 𝑛𝑣 est une relation de
Bézout, alors 𝑎−1 = 𝑢 dans 𝐙/𝑛𝐙.
×
2. L’ ensemble des inversibles modulo 𝑛, noté (𝐙/𝑛𝐙) , est un groupe pour la multiplication.
×
Proposition III – 3. L’anneau 𝐙/𝑛𝐙 est un corps si et seulement si 𝑛 est premier. Si 𝑝 est premier, 𝐙/𝑝𝐙 =
∗
𝐙/𝑝𝐙 est un groupe multiplicatif d’ordre 𝑝 − 1.
Indicatrice d’Euler
Définition III – 4. La fonction ou indicatrice d’Euler :
×
φ(𝑛) = Card {𝑎, 1 ⩽ 𝑎 ⩽ 𝑛, pgcd(𝑎, 𝑛 = 1} = Card (𝐙/𝑛𝐙) .
Proposition III – 5. Soit 𝑝 premier
• φ(𝑝) = 𝑝 − 1.
• φ(𝑝𝑘 ) = 𝑝𝑘 − 𝑝𝑘−1 = 𝑝𝑘−1 (𝑝 − 1) pour 𝑘 ⩾ 1.
Théorème III – 6. Théorème des restes chinois. Soient 𝑚 et 𝑛 deux entiers premiers entre eux, on a l’iso-
morphisme
∼
𝐙/𝑚𝑛𝐙 ⟶ 𝐙/𝑚𝐙 × 𝐙/𝑛𝐙
𝑎 ⟼ (𝑎 (mod 𝑚), 𝑎 (mod 𝑛))
Une manière de prouver ce théorème est d’établir la surjectivité de ce morphisme ce qui donne un
algorithme pour reconstituer 𝑎 (mod 𝑚𝑛) à partir de 𝑎 (mod 𝑚) et 𝑎 (mod 𝑛). On réalise pour cela une
interpolation. À partir d’une relation de Bézout 1 = 𝑚𝑢 + 𝑛𝑣, on pose 𝑦 = 𝑚𝑢 et 𝑥 = 𝑛𝑣. En notant 𝑓 le
morphisme de l’énoncé du théorème, on a 𝑓(𝑥) = (1, 0) et 𝑓(𝑦) = (0, 1). Étant donné (𝑐, 𝑑) ∈ 𝐙/𝑚𝐙 × 𝐙/𝑛𝐙,
on a alors 𝑓(𝑐𝑥 + 𝑑𝑦) = (𝑐, 𝑑).
Une conséquence pratique de ce théorème est qu’il est équivalent de calculer dans 𝐙/𝑚𝑛𝐙 et dans
𝐙/𝑚𝐙 × 𝐙/𝑛𝐙. Or calculer dans ce produit cartésien est en général plus rapide.
Corollaire III – 7. Soient 𝑚 et 𝑛 deux entiers premiers entre eux, on a
φ(𝑚𝑛) = φ(𝑚) φ(𝑛).
ℓ α
Au final, on obtient la formule : si 𝑛 = ∏𝑖=1 𝑝𝑖 𝑖 avec les 𝑝𝑖 premiers distincts et les α𝑖 ⩾ 1,
ℓ ℓ
α α −1
φ(𝑛) = φ(𝑝𝑖 𝑖 ) = 𝑝𝑖 𝑖 (𝑝𝑖 − 1).
𝑖=1 𝑖=1
– 11 –
Chapitre III : Rappels d’arithmétique
Cyclicité
Pour la cryptographie basée sur le problème du logarithme discret, nous utiliserons le résultat (admis)
suivant.
× ×
Si 𝑝 est premier 𝐙/𝑝𝐙 est cyclique : il existe 𝑔 ∈ 𝐙/𝑝𝐙 d’ordre 𝑝 − 1 et ⟨𝑔⟩ = {𝑔, 𝑔2 , … , 𝑔𝑝−1 = 1} =
×
𝐙/𝑝𝐙 .
– 12 –
Chapitre IV
1. RSA
L’un des premiers systèmes de chiffrements asymétriques. Rivest, Shamir, Adleman, 1977.
Principe
Pour recevoir des messages Bob choisit deux grands nombres premiers 𝑝 et 𝑞 distincts et pose N = 𝑝𝑞.
On a alors φ(N) = (𝑝 − 1)(𝑞 − 1). Bob choisit 𝑒, un entier premier avec φ(N) et pose 𝑑 tel que 𝑒𝑑 ≡ 1
(mod φ(N)).
Le couple KBpub = (N, 𝑒) constitue la clef publique de Bob, et KBpriv = 𝑑 est sa clef privée.
×
Pour envoyer un message 𝑚 ∈ (𝐙/N𝐙) à Bob, Alice calcule ChiffKB (𝑚) ∶= 𝑐 ∶= 𝑚𝑒 (mod N).
pub
Ce système de chiffrement est correct car si 𝑐 ≡ 𝑚𝑒 (mod N), 𝑐𝑑 ≡ 𝑚𝑒𝑑 ≡ 𝑚1+𝑘φ(N) ≡ 𝑚 (mod N) par
le théorème d’Euler.
Sécurité
Dans le cadre d’un chiffrement asymétrique on se place dans le contexte minimal d’une attaque à clairs
choisis, la clef publique étant connue, un adversaire peut obtenir les chiffrés des messages clairs de son
choix.
Le but le plus fort pour un adversaire est le bris total : retrouver la clef secrète à partir de la clef publique,
c’est à dire 𝑑 à partir de (N, 𝑒). On peut montrer que cela est équivalent à factoriser N : retrouver les facteurs
premiers 𝑝 et 𝑞.
Un but moins fort est de casser la notion de sens unique : retrouver 𝑚 à partir de 𝑐 ≡ 𝑚𝑒 (mod N)
connaissant N et 𝑒. On ne connaît pas d’autres méthodes que de factoriser N (pour retrouver 𝑑) afin de
résoudre ce problème.
Mise en œuvre
On sait déjà comment calculer efficacement les exponentiations modulaires des algorithmes de chif-
frement et déchiffrement. Il reste deux problèmes à résoudre :
1. Quelle taille pour N afin de se prémunir des attaques ? Pour cela on va étudier les algorithmes de
factorisation d’entiers.
– 13 –
Chapitre IV : Le chiffrement RSA et problèmes associés
2. Comment Bob peut il construire N, c’est à dire trouver 𝑝 et 𝑞 ? Pour cela on va étudier des tests de
primalité.
2. Factorisation d’entiers
L’entier N de RSA ne doit pas pouvoir être factorisé (en temps raisonnable). On utilise actuellement des
N d’au moins 2048 bits (plus de 600 chiffres décimaux). On estime que factoriser un tel nombre prendrait
de l’ordre de 2112 opérations élémentaires.
Le record actuel date de février 2020 : factorisation d’un entier RSA de 829 bits (250 chiffres décimaux)
en utilisant le meilleur algorithme connu, l’algorithme du crible sur corps de nombres (NFS, Number Field
Sieve). Cet algorithme a une complexité sous-exponentielle que l’on note traditionnellement sous la forme
α 1−α
L N [1/3] avec L N [α] = 𝑒𝑐(log N) (log log N) où 𝑐 est une certaine constante strictement positive.
D’autres algorithmes de factorisation sont adaptés à trouver des facteurs relativement petits d’un entier
N : méthode ρ de Pollard (1975), de complexité exponentielle 𝒪 (√𝑝) où 𝑝 est le plus petit facteur premier de
N. De même un algorithme basé sur les courbes elliptiques a une complexité sous-exponentielle en L 𝑝 [1/2].
Nous allons étudier un autre algorithme qui donne les idées de base du crible sur corps de nombres.
La deuxième idée est de « fabriquer » ces deux entiers en utilisant un base de petits facteurs premiers
ℬ = {𝑝1 , 𝑝2 , … 𝑝𝑘 }. On tire des entiers 𝑧 au hasard avec 1 < 𝑧 < N. On calcule ensuite 𝑟 = 𝑧2 mod N et on
essaye de factoriser 𝑟 dans la base ℬ . Si cela non fonctionne pas, on « jette » 𝑧. Sinon on le garde ainsi que
la décomposition obtenue (on parle de relation). On recommence ce procédé jusqu’à obtenir un certain
nombre, ℓ, de relations :
⎧ 2 𝑚 𝑚 𝑚
⎪
⎪ 𝑧1 ≡ 𝑝1 1,1 𝑝2 1,2 ⋯ 𝑝𝑘 1,𝑘 (mod N)
⎪
⎪
⎨ ⋮
⎪
⎪ ⋮
⎪
⎪
⎩ 2 𝑚 𝑚 𝑚
𝑧ℓ ≡ 𝑝1 ℓ,1 𝑝2 ℓ,2 ⋯ 𝑝𝑘 ℓ,𝑘 (mod N)
Par conséquent
(2087 ⋅ 3473 ⋅ 3725)2 ≡ (28 ⋅ 32 ⋅ 52 ⋅ 11 ⋅ 13)2 (mod N).
On pose 𝑥 = 2087 ⋅ 3473 ⋅ 3725 et 𝑦 = 28 ⋅ 32 ⋅ 52 ⋅ 11 ⋅ 13, on a 𝑥 ≢ ±𝑦 (mod N) et pgcd(𝑥 − 𝑦, N) = 541,
pgcd(𝑥 + 𝑦, N) = 719. On a en fait N = 541 ⋅ 719.
Dans le cas général, on forme une matrice M à coefficients dans le corps 𝐙/2𝐙 à partir des exposants
trouvés dans les relations :
– 14 –
3. Tests de primalité
⎛ ⎞
⎜⎜𝑚1,1 𝑚1,2 … 𝑚1,𝑘 ⎟⎟
⎜⎜𝑚 𝑚2,2 … 𝑚2,𝑘 ⎟⎟⎟
M = ⎜⎜⎜ 2,1 ⎟,
⎜⎜ ⋮ ⋮ ⋮ ⎟⎟⎟
⎝ ⎠
𝑚ℓ,1 𝑚ℓ,2 … 𝑚ℓ,𝑘
et on cherche α = (α1 , α2 , … , αℓ ) ∈ (𝐙/2𝐙)𝑘 non nul tel que αM ≡ (0, 0, … , 0) (mod 2). Ainsi α est un
élément non nul du noyau (à gauche) de M et son existence sera assurée si le nombre de relations trouvées
ℓ est strictement plus grand que 𝑘 (la taille de la base de facteurs). Une base de facteurs petite permettra
d’avoir cette condition satisfaite rapidement mais diminuera la probabilité que 𝑟 se factorise dans cette
base.
Une fois α trouvé on obtient
α α α 𝑛 𝑛 𝑛
(𝑧1 1 𝑧2 2 ⋯ 𝑧ℓ ℓ )2 ≡ 𝑝1 1 𝑝2 2 ⋯ 𝑝𝑘 𝑘 (mod N),
où les 𝑛𝑖 sont tous pairs. On a donc une congruence entre deux carrés.
Retour à l’exemple On a
⎛ ⎞
⎜⎜0 1 0 0 0 0⎟⎟
M = ⎜⎜⎜0 0 1 0 0 0⎟⎟⎟ ,
⎝ ⎠
0 1 1 0 0 0
on est chanceux, avec seulement 3 relations, on obtient 3 lignes liées : (1, 1, 1)M = (0, 0, … , 0).
3. Tests de primalité
Pour construire les clefs RSA actuelles, on doit générer deux grands nombres premiers aléatoires 𝑝 et
𝑞 afin de construire le module public N = 𝑝𝑞. Actuellement on prend 𝑝 et 𝑞 d’au moins 1024 bits (plus de
300 chiffres décimaux). Pour générer ces premiers, on prend des nombres aléatoires de cette taille et on
teste s’ils sont premiers ou non. Pour cela, on utilise des tests de primalité.
Une première idée pour établir un test de primalité et de se baser sur le petit théorème de Fermat. Si
𝑝 est premier on sait que pour tout 𝑎 premier avec 𝑝, 𝑎𝑝−1 ≡ 1 (mod 𝑝).
Pour établir si un entier N est premier ou pas, on tire donc des entiers 𝑎 au hasard premiers avec N et
on calcule 𝑏 ≡ 𝑎N−1 (mod N). Ensuite,
• si 𝑏 ≢ 1 (mod N), alors on est sûr que N est composé par contraposée du petit théorème de Fermat,
𝑎 est un témoin de non primalité ;
• si 𝑏 ≡ 1 (mod N), alors est N est peut-être premier. On recommence donc ce test avec un autre 𝑎.
Cependant, il existe une infinité de nombres composés N tels que 𝑎N−1 ≡ 1 (mod N) pour tout 𝑎
premier avec N. Ce sont les nombres de Carmichael (le plus petit est 561). Ainsi pour ces nombres, il
n’existe pas de témoin de non primalité pour ce test naïf.
Le test de Miller Rabin est un raffinement de ce test naïf, qui donne un algorithme aussi efficace pour
lequel il existe une grande proportion de témoins de non primalité pour tous les nombres composés.
– 15 –
Chapitre IV : Le chiffrement RSA et problèmes associés
Théorème IV – 1. Soit N un nombre impair avec N − 1 = 2𝑠 𝑡, où 𝑡 est impair. S’il existe un entier 𝑎 premier avec
𝑖
N tel que 𝑎𝑡 ≢ 1 (mod N) et 𝑎2 𝑡 ≢ −1 (mod N) pour 𝑖 = 0, 1, … 𝑠 − 1 alors N est composé.
Démonstration. Par contraposée, on démontre que si N est premier alors pour tout entier 𝑎 premier avec
𝑖
N, soit 𝑎𝑡 ≡ 1 (mod N) soit il existe 𝑖 avec 0 ⩽ 𝑖 ⩽ 𝑠 − 1 tel que 𝑎2 𝑡 ≡ −1 (mod N).
D’après le théorème de Fermat, 𝑎 N−1 ≡ 1 (mod N), c’est à dire
𝑠−1 𝑡
(𝑎2 )2 ≡ 1 (mod N).
Or comme N est premier, si X 2 ≡ 1 (mod N) alors X ≡ 1 (mod N) ou X ≡ −1 (mod N).
𝑠−1 𝑠−1
Donc soit 𝑎2 𝑡 ≡ −1 (mod N) et 𝑖 = 𝑠 − 1 convient, soit 𝑎2 𝑡 ≡ 1 (mod N). Dans ce dernier cas, si
𝑠 − 1 > 0 on itère le procédé jusqu’à trouver une puissance de 2 nulle.
𝑖 𝑖
Ainsi, soit on trouve 𝑖 avec 0 ⩽ 𝑖 ⩽ 𝑠 − 1 tel que 𝑎2 𝑡 ≡ −1 (mod N), soit pour tout 0 ⩽ 𝑖 ⩽ 𝑠 − 1, 𝑎2 𝑡 ≡ 1
(mod N) et en particulier, 𝑎 ≡ 1 (mod N).
𝑡
On va utiliser de tels 𝑎 comme témoins de non primalité. De plus, si N est composé, on peut borner la
proportion de nombres qui ne sont pas témoins.
Théorème IV – 2 (admis). Soit N > 9 un nombre composé impair avec N − 1 = 2𝑠 𝑡, où 𝑡 est impair. Alors
× 𝑖 φ(N)
Card 𝑎 ∈ (𝐙/N𝐙) , 𝑎𝑡 ≡ 1 (mod N) ou 𝑎2 𝑡 ≡ −1 (mod N) pour un 0 ⩽ 𝑖 ⩽ 𝑠 − 1 ⩽ ⋅
4
1
Ainsi si N est composé, en tirant 𝑎 premier avec N avec équiprobabilité, on a une probabilité ⩽ de
4
ne pas tomber sur un témoin de non primalité.
Cet algorithme a à peu près la même complexité qu’une exponentiation dans 𝐙/N𝐙 du type 𝑎N−1 . En
utilisant les opérations naïves on obtient donc une complexité en 𝒪 (𝑛3 ) où 𝑛 est la taille de N.
En itérant 𝑘 fois cet algorithme (pour des tirs aléatoires indépendants), on obtient une probabilité
⩽ 1/4𝑘 qu’un nombre composé soit déclaré probablement premier. Avec quelques dizaines d’itérations,
ceci devient négligeable !
D’autres tests
Le test de Miller Rabin et des variantes sont suffisants pour des applications cryptographiques et en
particulier pour générer des nombres premiers pour RSA. On parle en général de test de pseudo primalité
(et donc de nombres pseudo premiers).
Il existe aussi une classe de véritables tests de primalité retournant soit « N est premier » soit « N est
composé » avec dans les deux cas une preuve de la réponse. Ainsi le test AKS (Agrawal, Kayal et Saxena,
2002) est le premier algorithme polynomial déterministe à la complexité prouvée de cette classe. Résolvant
un problème théorique, il est cependant inefficace en pratique. On lui préfère donc l’algorithme APRCL
utilisant les corps cyclotomiques à la complexité quasi-polynomiale ou un test utilisant les courbes ellip-
tiques (ECPP) conjecturé polynomial. Ces deux algorithmes nécessitent plusieurs dizaines de secondes
pour tester un nombre de 1024 bits contre quelques millisecondes pour un test à la Miller Rabin.
– 16 –
Chapitre V
Si ce problème est difficile dans G alors la fonction 𝑥 ↦ 𝑔𝑥 est à sens unique. Ce problème n’est pas
toujours difficile par exemple si G = (𝐙/𝑛𝐙, +). Dans ce cas un entier 𝑔 engendre G si pgcd(𝑔, 𝑛) = 1. Si
ℎ ∈ G, en notation additive, on a ℎ ≡ 𝑥𝑔 (mod 𝑛) et on peut trouver 𝑥 en calculant 𝑥 = ℎ𝑔−1 (mod 𝑛).
Cependant il existe des groupes dans lequel ce problème est supposé difficile notamment dans des sous
×
groupes de 𝐙/𝑝𝐙 pour 𝑝 premier et des groupes utilisant des courbes elliptiques sur des corps finis. Ces
deux groupes permettent de construire de nombreux systèmes cryptographiques basés sur le problème du
logarithme discret.
• Ensuite Alice choisit un 𝑎 aléatoire 1 < 𝑎 < 𝑛 et calcule A ∶= 𝑔𝑎 et envoie cette quantité à Bob sur
un canal public.
• Parallèlement Bob choisit un 𝑏 aléatoire 1 < 𝑏 < 𝑛 et calcule B ∶= 𝑔𝑏 et envoie cette quantité à Alice
sur ce canal public.
• Alice calcule B 𝑎 = 𝑔𝑎𝑏 . Bob de son côté calcule A𝑏 = 𝑔𝑎𝑏 . Cette quantité C = 𝑔𝑎𝑏 sera leur secret
commun.
Pour retrouver cette quantité, Oscar qui écoute les échanges entre Alice et Bob doit résoudre le pro-
blème suivant : étant donné A, B ∈ G calculer C ∈ G tel que C = 𝑔𝑎𝑏 où 𝑎 et 𝑏 sont tels que A = 𝑔𝑎 et
B = 𝑔𝑏 . Ce problème est appelé problème calculatoire de Diffie-Hellman, et (A, B, C) est appelé un
triplet Diffie-Hellman.
– 17 –
Chapitre V : Cryptographie basée sur le problème du logarithme discret
Si on sait calculer des logarithmes discrets dans G alors on peut résoudre ce problème (en calculant 𝑎
ou 𝑏). Cependant on ne sait pas s’il est possible de résoudre ce problème sans savoir calculer de logarithme
discret.
Un but moins fort pour Oscar serait d’obtenir une information sur C à partir de A et B. Ceci est
équivalent à résoudre le problème décisionnel suivant : étant donné A, B, C ∈ G, décider si (A, B, C) est
un triplet Diffie-Hellman ou non. On parle de problème décisionnel de Diffie-Hellman. La seule
manière connue de résoudre ce problème est de résoudre le problème calculatoire associé en calculant un
logarithme discret.
Pour envoyer un message 𝑚 ∈ G à Bob, Alice choisit 𝑟 aléatoire 1 < 𝑟 < 𝑛, et calcule ChiffKB (𝑚) ∶=
pub
𝑐 ∶= (𝑐1 , 𝑐2 ) = (𝑔𝑟 , 𝑚ℎ𝑟 ) ∈ G × G.
Ce système de chiffrement est correct car si (𝑐1 , 𝑐2 ) = (𝑔𝑟 , 𝑚ℎ𝑟 ), 𝑐𝑥1 = 𝑔𝑟𝑥 = ℎ𝑟 comme dans l’échange de
clef Diffie-Hellman. Donc 𝑐2 𝑐−𝑥 𝑟 𝑟 −1 = 𝑚.
1 = 𝑚ℎ (ℎ )
Sécurité
Comme pour RSA on se place dans le contexte minimal d’une attaque à clairs choisis, la clef publique
étant connue, un adversaire peut obtenir les chiffrés des messages clairs de son choix.
Le bris total (retrouver la clef secrète à partir de la clef publique) est équivalent au problème du loga-
rithme discret dans G.
On peut montrer que casser la notion de sens unique est équivalent à résoudre un problème calculatoire
Diffie-Hellman dans G, en effet (ℎ, 𝑐1 , ℎ𝑟 ) est un triplet Diffie-Hellman.
De même ce système est sémantiquement sûr (étant donné un chiffré 𝑐 il est difficile de retrouver une
information sur le message clair 𝑚) si et seulement si le problème décisionnel de Diffie-Hellman est difficile
dans G.
Remarquons que le chiffrement RSA n’atteint pas une telle sécurité sémantique car le chiffrement est
déterministe (contrairement à Elgamal) : un message 𝑚 a un unique chiffré 𝑐, et on peut donc tester si un
chiffré 𝑐 chiffre un message 𝑚 donné.
Algorithme de Shanks
On se place toujours dans le contexte d’un groupe (G, ×) cyclique d’ordre 𝑛 et 𝑔 un générateur. Soit
ℎ ∈ G dont on souhaite calculer le logarithme discret 𝑥 en base 𝑔 : 𝑥 = log𝑔 (ℎ).
– 18 –
3. Algorithmes de calcul de logarithmes discrets
Un compromis temps mémoire a été proposé par Shanks (1971) connu sous le nom « pas de bébé, pas
de géant ». On pose 𝑚 = ⌈√𝑛⌉ et on écrit 𝑥 = 𝑦 + 𝑚𝑧 avec 0 ⩽ 𝑦, 𝑧 < 𝑚. On a alors ℎ = 𝑔𝑥 = (𝑔𝑚 )𝑧 𝑔𝑦 . Donc
Ensuite dans une phase active, on calcule successivement ℎ, ℎ𝑔−1 , ℎ(𝑔−1 )2 , … et on cherche à chaque
fois l’élément dans la liste par recherche dichotomique. Ce sont les pas de bébé. À l’itération 𝑦 on trouvera
l’élément, et on en déduira le logarithme discret en utilisant (V.1).
Dans le cas le pire, cette phase utilise 𝒪 (√𝑛) multiplications dans G et les recherches 𝒪 (√𝑛 log(𝑛))
comparaisons.
Au final cette méthode est toujours exponentielle mais améliore la recherche naïve : on utilise 𝒪 (√𝑛)
multiplications dans G, cependant on doit stocker autant d’éléments en mémoire, ce qui est le point blo-
quant. Il existe une méthode probabiliste due à Pollard (1978) qui garde la même complexité calculatoire
mais en utilisant très peu de mémoire. Ce sont les meilleures méthodes connues dans un groupe générique.
Calcul d’indice
La première idée de cet algorithme vient de Kraitchik (1922) puis cela a été redécouvert et développé
à la fin des années 1970.
×
On considère maintenant le cas de sous groupes d’ordre premier de 𝐙/𝑝𝐙 avec 𝑝 premier, cas typique
×
en cryptographie. On note α un générateur de 𝐙/𝑝𝐙 (donc d’ordre 𝑝 − 1). Soit 𝑞 un diviseur premier de
𝑝 − 1, on note 𝑧 ∶= (𝑝 − 1)/𝑞 et on suppose de plus que pgcd(𝑞, 𝑧) = 1. On pose 𝑔 = α𝑧 . Cet élément est
d’ordre 𝑞 et on note G le sous-groupe qu’il engendre.
Soit ℎ ∈ G dont on souhaite toujours calculer le logarithme discret 𝑥 en base 𝑔 : 𝑥 = log𝑔 (ℎ), qui est
définit modulo 𝑞.
Comme pour la méthode de Dixon pour factoriser, on se donne une base de petits facteurs premiers
ℬ = {𝑝1 , 𝑝2 , … , 𝑝𝑘 }.
Dans une étape de précalculs, on établie les valeurs 𝑥𝑖 ∶= logα 𝑝𝑖 modulo 𝑞 pour 1 ⩽ 𝑖 ⩽ 𝑘. Pour cela on
tire des entiers 𝑟 au hasard avec 1 < 𝑟 < 𝑝 − 1, on calcule ensuite α𝑟 mod 𝑝 et on essaye de factoriser ce
nombre dans la base ℬ . Si cela ne fonctionne pas, on « jette » 𝑟. Sinon, on obtient une relation du type
𝑚 𝑚 𝑚
α𝑟 ≡ 𝑝1 1 𝑝2 2 ⋯ 𝑝𝑘 𝑘 (mod 𝑝).
En passant au logarithme discret en base α réduit modulo 𝑞 (qui divise 𝑝 − 1, l’ordre de α), on obtient
l’équation linéaire
𝑟 ≡ 𝑚1 𝑥1 + 𝑚2 𝑥2 + ⋯ + 𝑚𝑘 𝑥𝑘 (mod 𝑞).
En ayant obtenu suffisamment de relations pour avoir 𝑘 équations linéairement indépendantes, on peut
résoudre un système linéaire dans le corps 𝐙/𝑞𝐙 pour obtenir la valeur des 𝑥𝑖 = logα 𝑝𝑖 modulo 𝑞.
Durant la phase active, on tire des 𝑟 au hasard et on calcule des ℎα𝑟 jusqu’à pouvoir factoriser dans ℬ :
𝑘 𝑒
ℎα = ∏𝑖=1 𝑝𝑖 𝑖 . On obtient alors l’équation
𝑟
– 19 –
Chapitre V : Cryptographie basée sur le problème du logarithme discret
dont on peut tirer la valeur 𝑦 ∶= logα ℎ modulo 𝑞. Pour trouver la valeur de 𝑥 ∶= log𝑔 ℎ (définie modulo 𝑞),
on utilise l’égalité suivante :
ℎ = 𝑔𝑥 = α𝑧𝑥 = α𝑦 .
On a donc en particulier 𝑧𝑥 ≡ 𝑦 (mod 𝑞) et comme on a supposé que pgcd(𝑞, 𝑧) = 1, on en déduit
4. Conséquences cryptographiques
Pour implanter l’échange de clef Diffie-Hellman et Elgamal, il faut utiliser un groupe cyclique G où
le problème du logarithme est difficile. Un choix classique est d’utiliser comme précédemment un sous
×
groupe d’ordre premier 𝑞 de 𝐙/𝑝𝐙 avec 𝑝 premier et 𝑞|𝑝 − 1. Le fait d’avoir 𝑞 premier permet d’éviter une
méthode due à Pohlig-Hellman qui ramène le calcul modulo les facteurs premiers de l’ordre du groupe en
utilisant les restes chinois.
Pour que les meilleures attaques connues fonctionnent en 2112 opérations il faut donc prendre 𝑞 d’au
moins 224 bits pour éviter les attaques génériques (algorithme de Pollard). La taille de 𝑝 est elle donnée
par la complexité du crible sur corps de nombres pour le logarithme discret. On estime aujourd’hui qu’il
faut 𝑝 de 2048 bits (comme pour la factorisation) pour que cet algorithme utilise au moins 2112 opérations.
Un autre choix pour la cryptographie est d’utiliser des groupes issus des courbes elliptiques. Là seule
les méthodes génériques fonctionnent et on peut donc prendre des paramètres beaucoup plus petits.
– 20 –
Chapitre VI
1. Rappels
On s’intéresse ici à un chiffrement symétrique ou à clef secrète. La même clef sert pour le chiffrement
et le déchiffrement.
Dans le chiffrement par bloc, le message clair est découpé en blocs de ℓ bits. À une clef secrète 𝑘,
une chaîne de bits aléatoire d’une certaine longueur, on fait correspondre une permutation σ𝑘 de {0, 1}ℓ :
la description de cette correspondance correspond à la description de l’algorithme de chiffrement. La
fonction de chiffrement est alors 𝑚 ↦ σ𝑘 (𝑚).
Tout l’enjeu est de produire une permutation σ𝑘 la plus « aléatoire » possible tout en gardant une certaine
structure pour avoir un algorithme de longueur succincte (décrire une fonction sans structure quelconque
se fait en donnant la liste de ses images ici en 2ℓ × ℓ bits).
Les standards successifs sont le DES pour Data Encryption Standard de 1977 à 2000, qui utilise une clef
𝑘 de 56 bits et ℓ = 64, maintenant obsolète à cause de sa petite taille de clef ; puis l’AES pour Advanced
Encryption Standard depuis 2000, qui utilise une clef de 128, 192 ou 256 bits et ℓ = 128. Cet algorithme est
massivement utilisé aujourd’hui (3G, 4G, WPA pour le Wifi, TLS/SSL pour le Web).
2. Principes de conception
Comme dit précédemment on veut décrire un algorithme de chiffrement qui correspond à une permu-
tation σ𝑘 de {0, 1}ℓ paramétrée par la clef secrète 𝑘.
Ainsi on généralise le chiffrement historique par substitution : la clef était une permutation σ de 𝐙/26𝐙
et on chiffrait 𝑚 par σ(𝑚). Ce chiffrement avait deux principaux inconvénients. Premièrement une grande
taille de clef secrète par rapport à la taille du message clair 𝑚 : la clef secrète est la description de la
permutation, soit la liste (σ(0), σ(1), … , σ(25)), 26 éléments de 𝐙/26𝐙. Deuxièmement, une faible sécurité :
on peut analyser les fréquences, et on peut faire une attaque par dictionnaire. C’est une attaque à texte
clair connu qui consiste à établir la correspondance entre les 26 clairs possibles et leurs chiffrés.
Pour le chiffrement par blocs on utilise donc ℓ grand (128 pour l’AES) afin que l’espace des messages
{0, 1}ℓ soit grand. La description d’une permutation quelconque de {0, 1}ℓ devient donc impossible. On
redécoupe donc ces ℓ bits en plusieurs paquets plus petits (16 paquets de 8 bits par exemple pour l’AES)
sur lesquels on applique des permutations complexes que l’on peut décrire de manière succincte par une
table. Ces permutations sont appelées boîtes S. Cette étape de substitution apporte de la confusion,
elle complexifie les relations entre entrée et sortie.
Après cette étape, on « mélange » les sorties afin de propager sur le bloc tout entier le résultat des
substitutions. C’est une étape de diffusion. Ceci peut se faire en appliquant une permutation des bits
(donc une permutation de l’ensemble des indices {1, … , ℓ}) ou plus généralement une application linéaire
(ou affine) bijective de (𝐙/2𝐙)ℓ dans (𝐙/2𝐙)ℓ . Ci-dessous, un exemple avec un bloc de 16 bits découpés en
4 paquets de 4 bits.
– 21 –
Chapitre VI : Chiffrement symétrique par bloc
σ1 σ2 σ3 σ4
Ces concepts de diffusion et de confusion ont été introduits par Shannon en 1949. Les chiffrements
par blocs modernes sont bâtis sur l’alternance de ces étapes de confusion et de diffusion.
Plus précisément, on utilise une construction itérative. On définit une fonction de tour, F 𝑘𝑖 dépen-
dant d’une clef de tour 𝑘𝑖 et opérant sur un bloc. Cette fonction utilise au moins une étape de confusion et
une de diffusion. À partir d’une clef secrète 𝑘 on dérive des clefs de tour (𝑘1 , … , 𝑘𝑟 ) par un algorithme dit
de cadencement de clefs. Puis on itère 𝑟 fois la fonction de tour sur le message clair 𝑚 en utilisant chacune
des clefs de tour. On obtient ainsi le chiffré 𝑐.
Cette construction itérative permet une description concise de l’algorithme de chiffrement. On doit
juste décrire la fonction F et l’algorithme de cadencement de clefs.
F 𝑘1 F 𝑘2 F 𝑘𝑟
𝑚 = 𝑥0 𝑥1 𝑥2 … 𝑥𝑟 = 𝑐
Une construction classique, appelée réseau de substitutions et permutations, suit un tel procédé
itératif. Elle est à la base du chiffrement AES. À partir de la clef secrète 𝑘 on crée 𝑟 + 1 clefs de tour,
(𝑘0 , 𝑘1 , … , 𝑘𝑟 ) par un algorithme de cadencement de clefs. Ces clefs de tours sont toutes des chaînes de ℓ
bits.
On effectue une étape initiale d’ajout de la première clef de tour : étant donné un bloc de message clair
𝑚 ∈ {0, 1}ℓ , on pose 𝑥0 = 𝑚 + 𝑘0 . Cette addition se fait modulo 2, c’est à dire que l’on additionne deux
vecteurs de (𝐙/2𝐙)ℓ . Cela correspond à calculer le « ou exclusif » (X-OR) bit à bit. On note parfois aussi
𝑚 ⊕ 𝑘0 et on dit en franglais que l’on « xore » 𝑚 et 𝑘0 .
Puis pour 𝑖 = 0, … , 𝑟 − 1, on calcule 𝑥𝑖+1 = F 𝑘𝑖+1 (𝑥𝑖 ) pour obtenir le chiffré 𝑐 = 𝑥𝑟 . La fonction de tour
F commence par l’application de 𝑠 boîtes S bijectives (étape de confusion) sur 𝑥𝑖 découpé en 𝑠 sous blocs,
pour donner un nouveau bloc 𝑢𝑖 . Puis on applique une permutation linéaire P (étape de diffusion) sur les
bits de 𝑢𝑖 , on note 𝑣𝑖 le résultat. Enfin, on ajoute la clef de tour : 𝑥𝑖+1 = 𝑣𝑖 + 𝑘𝑖+1 .
𝑥𝑖
S1 S2 S𝑠
𝑢𝑖
P
𝑣𝑖
𝑥𝑖+1
– 22 –
3. Corps finis
L’étape initiale évite qu’un attaquant puisse calculer le début du chiffrement jusqu’à l’ajout de clef 𝑘1 .
Le déchiffrement se fait en « remontant » tout le chiffrement, toutes les opérations étant inversibles. Bien
noter que seule la clef secrète 𝑘 constituera un secret, toutes les fonctions utilisées (boîtes S, fonction P,
cadencement des clefs) seront publiques.
L’AES suit une telle construction. Cet algorithme de chiffrement par bloc utilise une clef de 128, 192
ou 256 bits avec des blocs de 128 bits. Suivant la taille de la clef, le nombre de tours est respectivement
10, 12 et 14. Afin de décrire explicitement les fonctions utilisées pour le fonctionnement de l’AES, nous
avons besoin d’un outil mathématique, les corps finis.
3. Corps finis
Nous avons vu que l’anneau (𝐙/𝑛𝐙, +, ×) est un corps si et seulement si 𝑛 est premier. Pour 𝑝 premier,
on note 𝐅𝑝 ∶= 𝐙/𝑝𝐙 qui est un corps fini à 𝑝 éléments. On va construire d’autres corps finis, notamment
des corps à 2𝑘 éléments qui nous seront utile pour décrire l’AES. Pour cela on va considérer des quotients
de 𝐅2 [X]. Avant cela, rappelons les similarités entre les anneaux euclidiens 𝐙 et K[X] où K est un corps
commutatif.
On a dans K[X] une division euclidienne, le degré jouant le rôle de la valeur absolue dans 𝐙. Plus
précisément, pour tout A(X), B(X) ∈ K[X] avec B non nul, il existe Q(X), R(X) ∈ K[X] uniques tels que
A(X) = B(X)Q(X) + R(X) avec R(X) = 0 ou deg R < deg B.
Un exemple dans K[X] = 𝐅2 [X] : A(X) = X 3 et B(X) = X 2 +X+1. On trouve X 3 = (X+1)(X 2 +X+1)+1.
Un polynôme P(X) ∈ K[X] non constant est dit irréductible sur K s’il n’existe pas A(X), B(X) ∈ K[X]
tels que P(X) = A(X)B(X) avec A(X), B(X) tout deux non constants.
Par exemple toujours dans 𝐅2 [X], P(X) = X 2 +X+1 est irréductible. S’il ne l’était pas il devrait avoir deux
diviseurs de degré 1 (parmi X + 1 et X). En particulier, il devrait avoir une racine dans 𝐅2 , or P(0) = P(1) = 1.
Par contre X 2 , X 2 + 1 = (X + 1)2 et X 2 + X = X(X + 1) ne sont pas irréductibles.
𝐙 K[X]
Pour construire des corps à 2𝑘 éléments, notés 𝐅2𝑘 , on va considérer 𝐅2 [X]/(P(X) avec P un polynôme de
degré 𝑘 irréductible. Noter qu’il y a en général plusieurs choix possibles pour P, donnant des représentations
isomorphes pour 𝐅2𝑘 .
Le calcul dans 𝐅2 [X]/(P(X) sur le système de représentants canonique se fait ainsi :
• l’addition se fait coefficients par coefficients, cela correspond à « xorer » les deux listes des coeffi-
cients ;
• la multiplication se fait par multiplication dans 𝐅2 [X] suivie par une réduction modulo P(X) ;
• l’inversion par un Euclide étendu.
– 23 –
Chapitre VI : Chiffrement symétrique par bloc
Exemple de 𝐅4
On pose 𝐅4 = 𝐅2 [X]/(X 2 + X + 1) corps à 4 éléments (attention ne pas confondre avec 𝐙/4𝐙 qui n’est
pas un corps !).
Pour alléger les notations, on note α = X mod X 2 + X + 1. Ainsi 𝐅4 = {0, 1, α, α + 1} et α est une racine
de X 2 + X + 1 dans 𝐅4 : α2 + α + 1 = 0.
Ainsi comme les éléments de 𝐅2 sont les bits 0 et 1, un élément de 𝐅256 peut être représenté par 8 bits,
c’est à dire un octet. Plus précisément, dans l’AES, chaque élément 𝑏0 + 𝑏1 α + ⋯ + 𝑏7 α7 est identifié avec
l’octet (𝑏7 , 𝑏6 , … , 𝑏0 ) ∈ 𝐅2 (Attention au sens d’écriture !).
L’addition correspond donc à un xor de deux octets. Par exemple l’addition de (0100 0100) et de
(0101 0010) donne (0001 0110). Cela correspond au calcul (α6 + α2 ) + (α6 + α4 + α) = α4 + α2 + α.
Pour la multiplication, il faut comme vu pour 𝐅4 faire une réduction : soit par une division euclidienne,
soit en utilisant plusieurs fois l’identité α8 = α4 + α3 + α + 1. Ainsi la multiplication des deux octets
(1100 0011) et (0000 0110) donne (1011 1100). En effet, cela correspond à (α7 + α6 + α + 1)(α2 + α) =
α9 + α 7 + α 3 + α = α 7 + α 5 + α 4 + α 3 + α 2 .
Pour l’inversion, on utilise un Euclide étendu comme dans 𝐅4 . Par exemple l’inverse de (0000 0011)
donne (1111 0110). Une vérification : (α + 1)(α7 + α6 + α5 + α4 + α2 + α) = 1.
4. L’AES
On donne ici la description dans les grandes lignes de Advanced Encryption Standard (AES). C’est un
chiffrement itératif par bloc utilisant une construction de réseau de substitutions et permutations. Il admet
des clefs de 128, 192 ou 256 bits. Le nombre de tours, 𝑟, (en plus de l’étape initiale d’ajout de clef 𝑘0 ) est
respectivement de 10, 12 ou 14 pour chacune des tailles de clef. L’AES opère sur des blocs de 128 bits.
Un algorithme de cadencement de clefs1 calcule à partir de la clef secrète 𝑘 une suite de 𝑟 + 1 clefs de
tour (𝑘0 , … , 𝑘𝑟 ), comportant toutes 128 bits.
La fonction de tour est construite suivant le principe du réseau de substitutions et permutations : étape
de substitution, étape de permutation, ajout de la clef de tour. Pour l’étape de substitution, dans l’AES, on
applique une seule boîte S notée SubBytes sur chacun des 16 sous blocs de 8 bits, c’est à dire sur chaque
octet, du bloc de 128 bits. L’étape de permutation est constituée de l’application de deux opérations, notées
ShiftRows et MixColumns. Enfin, l’ajout de la clef de tour est noté AddRoundKey. On décrit ces opérations
plus bas.
Au final, le fonctionnement à haut niveau de l’AES est le suivant. On part d’un bloc de 128 bits de texte
clair et on applique successivement sur ce bloc les opérations suivantes :
1 voir par exemple https://en.wikipedia.org/wiki/AES_key_schedule pour une description.
– 24 –
4. L’AES
1. AddRoundKey(𝑘0 ) ;
2. Pour 𝑖 = 0, … , 𝑟−2, on effectue le tour comportant les 4 opérations SubBytes, ShiftRows, MixColumns,
AddRoundKey(𝑘𝑖+1 ) dans cet ordre ;
3. Un dernier tour ne comporte plus que 3 étapes : SubBytes, ShiftRows, AddRoundKey(𝑘𝑟 ) ;
4. Le contenu actuel du bloc donne les 128 bits du texte chiffré.
D’autre part, comme vu dans la section précédente, chaque octet est identifié avec un élément du corps
fini 𝐅256 .
SubBytes (boîte S)
Elle opère indépendamment sur chacun des 16 octets. C’est la composée S = 𝑓 ∘ I des applications
I ∶ 𝐅256 → 𝐅256
⎧
⎪
⎨𝑥−1 si 𝑥 ≠ 0,
𝑥 ↦ ⎪
⎩0 si 𝑥 = 0,
et
𝑓 ∶ (𝐅2 )8 → (𝐅2 )8
𝑦 ↦ A𝑦 + B
où A est une matrice 8×8 à coefficients dans 𝐅2 , B est un vecteur de (𝐅2 )8 , explicités en dessous. Plus préci-
7
sément, on identifie comme on l’a vu l’élément ∑𝑖=0 𝑦𝑖 α𝑖 de 𝐅256 calculé par I avec l’octet 𝑦 = (𝑦7 , 𝑦6 , … , 𝑦0 )
puis on calcule A𝑦 + B ainsi :
⎛ ⎞⎛ ⎞ ⎛ ⎞
⎜⎜1 0 0 0 1 1 1 1⎟⎟ ⎜⎜𝑦0 ⎟⎟ ⎜⎜1⎟⎟
⎜⎜⎜1 1 0 0 0 1 1 1⎟⎟⎟⎟ ⎜⎜⎜⎜𝑦1 ⎟⎟⎟⎟ ⎜⎜⎜⎜1⎟⎟⎟⎟
⎜⎜
⎜⎜1 1 1 0 0 0 1 1⎟⎟⎟ ⎜⎜⎜𝑦2 ⎟⎟⎟ ⎜⎜⎜0⎟⎟⎟
⎜⎜ ⎟⎜ ⎟ ⎜ ⎟
⎜⎜1 1 1 1 0 0 0 1⎟⎟⎟ ⎜⎜⎜𝑦3 ⎟⎟⎟ ⎜⎜⎜0⎟⎟⎟
⎜⎜ ⎟⎜ ⎟ + ⎜ ⎟.
⎜⎜⎜1 1 1 1 1 0 0 0⎟⎟⎟ ⎜⎜⎜𝑦4 ⎟⎟⎟ ⎜⎜⎜0⎟⎟⎟
⎜⎜0 ⎟⎜ ⎟ ⎜ ⎟
⎜⎜ 1 1 1 1 1 0 0⎟⎟⎟ ⎜⎜⎜𝑦5 ⎟⎟⎟ ⎜⎜⎜1⎟⎟⎟
⎜⎜0 ⎟⎜ ⎟ ⎜ ⎟
⎜⎝ 0 1 1 1 1 1 0⎟⎟⎟ ⎜⎜⎜𝑦6 ⎟⎟⎟ ⎜⎜⎜1⎟⎟⎟
⎠⎝ ⎠ ⎝ ⎠
0 0 0 1 1 1 1 1 𝑦7 0
En pratique, lorsque l’on implante l’AES, cette boîte S est donnée par une table décrivant toutes les
sorties2 , on ne fait pas les calculs dans le corps 𝐅256 et dans l’espace vectoriel (𝐅2 )8 .
La fonction I d’inversion dans le corps 𝐅256 a été choisie car on peut montrer qu’elle a de très bonnes
propriétés pour se protéger contre certaines attaques avancées. Ensuite, on compose par la fonction affine
𝑓 pour casser le caractère algébrique de I et enlever le point fixe 0 ↦ 0.
Exemple de calcul : on a déjà vu que l’inverse de l’octet (0000 0011) donne (1111 0110). En appliquant
𝑓, on trouve (0111 1011).
2 On peut la trouver ici : https://en.wikipedia.org/wiki/Rijndael_S-box
– 25 –
Chapitre VI : Chiffrement symétrique par bloc
ShiftRows
Elle fait subir une permutation circulaire vers la gauche aux lignes du tableau, respectivement de 0, 1,
2, 3 cases :
MixColumns
Elle s’interprète comme une multiplication matricielle :
où ⎛ ⎞ ⎛ ⎞⎛ ⎞
⎜⎜𝑏0,0 𝑏0,1 𝑏0,2 𝑏0,3 ⎟⎟ ⎜⎜ α α+1 1 1 ⎟⎟ ⎜⎜𝑎0,0 𝑎0,1 𝑎0,2 𝑎0,3 ⎟⎟
⎜⎜𝑏 𝑏1,1 𝑏1,2 𝑏1,3 ⎟⎟⎟ ⎜⎜⎜ 1 α α+1 1 ⎟⎟⎟ ⎜⎜⎜𝑎1,0 𝑎1,1 𝑎1,2 𝑎1,3 ⎟⎟⎟
⎜⎜ 1,0 ⎟=⎜ ⎟⎜ ⎟.
⎜⎜𝑏 𝑏2,1 𝑏2,2 𝑏2,3 ⎟⎟⎟ ⎜⎜⎜ 1 1 α α + 1⎟⎟⎟ ⎜⎜⎜𝑎2,0 𝑎2,1 𝑎2,2 𝑎2,3 ⎟⎟⎟
⎜⎝ 2,0 ⎠ ⎝ ⎠⎝ ⎠
𝑏3,0 𝑏3,1 𝑏3,2 𝑏3,3 α+1 1 1 α 𝑎3,0 𝑎3,1 𝑎3,2 𝑎3,3
est le produit des matrices à coefficients dans 𝐅256 . La matrice de cette opération a été choisie pour ses
propriétés de diffusion.
AddRoundKey(𝑘𝑖+1 )
C’est l’addition bit à bit (le xor) de la clef de tour 𝑘𝑖+1 , case par case.
– 26 –
Chapitre VII
Dans ce cours, on a surtout abordé la notion de chiffrement autant en cryptographie à clef publique
qu’en cryptographie à clef secrète. D’autre part, on a principalement développé des solutions mises en
place de la fin des années 70 à la fin des années 90. Du point de vue des objets mathématiques, on a surtout
utilisé les quotients de 𝐙 et les corps finis.
Dans ce chapitre, on donne une ouverture à quelques autres applications, notamment des applications
plus récentes, à d’autres objets mathématiques utilisés en cryptographie à clef publique et à quelques enjeux
actuels de la recherche dans le domaine.
Un exemple est la signature RSA. On utilise les mêmes notations que pour le chiffrement. On pose
N = 𝑝𝑞 avec 𝑝, 𝑞 deux grands nombres premiers distincts . On note 𝑒 et 𝑑 tels que 𝑒𝑑 ≡ 1 (mod φ(N)). La
clef publique d’Alice est toujours (N, 𝑒) et 𝑑 sa clef privée. Pour signer une chaîne de bits 𝑚, Alice com-
mence par appliquer sur 𝑚 une fonction ℎ (que l’on veut entre autre à sens unique), qui envoie 𝑚 sur ℎ(𝑚) un
×
élément de (𝐙/N𝐙) . Une telle fonction est appelée une fonction de hachage et on peut la construire à par-
tir de fonctions de hachages standardisées (SHA-2, SHA-3). La construction de ces fonctions ressemblent
aux constructions de chiffrement par blocs (mais sans clef).
Alice calcule ensuite
σ ∶≡ ℎ(𝑚)𝑑 (mod N).
Bob disposant de 𝑚, (N, 𝑒) et σ pourra vérifier que σ est bien la signature d’Alice du message 𝑚 en
testant si
?
σ𝑒 ≡ ℎ(𝑚) (mod N).
– 27 –
Chapitre VII : Panorama des développements actuels en cryptographie asymétrique
Il existe d’autres schémas de signatures, notamment basés sur le problème du logarithme discret,
×
comme le schéma DSA utilisant un sous groupe d’ordre premier 𝑞 de 𝐙/𝑝𝐙 ou le schéma ECDSA utili-
sant des courbes elliptiques.
– 28 –
2. Quelques autres outils mathématiques
D’autre part, à partir des années 2000, de nombreuses nouvelles applications cryptographiques (no-
tamment le chiffrement basé sur l’identité) sont apparus en utilisant un outil plus avancé, une application
bilinéaire de E × E dans un corps fini, appelée un couplage (pairing). L’utilisation de ce couplage a ainsi
permis de construire concrètement certains protocoles cryptographiques jusqu’alors théoriques.
Outils post-quantique
Un enjeu actuel en cryptographie est l’arrivée possible dans quelques (dizaines ?) d’années d’un ordi-
nateur quantique. Un tel ordinateur utiliserait des propriétés de physique quantique. Certains problèmes
algorithmiques réputés difficiles actuellement deviendraient facile avec un ordinateur quantique. En effet,
même si on ne dispose pas aujourd’hui d’un ordinateur quantique, on dispose d’algorithmes qu’il pourrait
exécuter.
En cryptographie, c’est notamment le cas pour le problème de la factorisation d’entiers ou celui du lo-
garithme discret dans n’importe quel groupe cyclique : l’algorithme de Shor (1994) permettrait de résoudre
ces deux problèmes en temps polynomial avec un ordinateur quantique, provoquant l’effondrement de
tous les systèmes cryptographiques que nous avons vu et largement déployés à l’heure actuelle ! On est
encore loin de cela, le record de factorisation avec l’algorithme de Shor étant celle du nombre 21 (en 2012).
Cependant, une cryptographie dite post-quantique est développée, c’est à dire une cryptographie dont
la sécurité repose sur des problèmes algorithmiques pour lesquels on ne connaît pas d’algorithmes quan-
tiques plus efficaces que les algorithmes classiques. Une compétition est actuellement organisée par le
NIST (l’organisme de normalisation américain) pour établir des standards de protocoles cryptographiques
post-quantiques. Des premiers algorithmes ont été standardisé en Juillet 2022.
Deux principaux objets mathématiques sont à l’œuvre : les réseaux euclidiens et les codes correc-
teurs. Pour les premiers il s’agit de sous groupes discrets de 𝐑𝑛 , c’est à dire de l’ensemble des combinaisons
linéaires à coefficients entiers de vecteurs de base 𝑏1 , … , 𝑏𝑑 ∈ 𝐑𝑛 :
⎧ ⎫
⎪
⎪ 𝑑 ⎪
⎪
⎨ 𝑛 ⎬
L=⎪ ⎪𝑣 ∈ 𝐑 , 𝑣 = λ 𝑏 ,
𝑖 𝑖 𝑖λ ∈ 𝐙 ⎪
⎪ .
⎩ 𝑖=1 ⎭
Pour les seconds, il s’agit de sous-espaces vectoriels C de 𝐅𝑛2 . Pour les deux, on considère des problèmes
algorithmiques similaires, par exemple celui du décodage : étant donné un point de l’espace, 𝐑𝑛 pour un
réseau, (resp. 𝐅𝑛2 pour un code) trouver le point du réseau L (resp. du code C) le plus proche. La notion de
proche différent dans les deux cas : au sens de la métrique euclidienne pour les réseaux, et au sens de la
métrique de Hamming pour les codes.
– 29 –