Initiation à la cryptographie avec Python
Gilles Dubertret
Deboeck supérieur
Introduction9
1 Les nombres premiers11
1.1 Nombres premiers11
1.2 Crible d'Ératosthène13
1.3 Facteurs premiers14
1.4 Complexité, liste des nombres premiers, spirale d'Ulam15
1.4.1 Notion de complexité algorithmique15
1.4.2 Liste des nombres premiers17
1.4.3 La spirale d'Ulam18
1.5 Décomposition en facteurs premiers19
1.6 Exercices20
2 Eléments d'arithmétique23
2.1 Congruences dans ℤ23
2.1.1 Introduction23
2.1.2 Congruence25
2.1.3 Ensemble quotient Z/nZ27
2.1.4 Structure algébrique de Z/nZ28
2.1.5 Groupe, anneau et corps29
2.1.6 Relation d'équivalence29
2.2 Cryptographie : César, Vigénère, permutation (Programmation)31
2.2.1 Système de cryptographie de César31
2.2.2 Système cryptographique de Vigenère34
2.2.3 Permutations alphabétiques34
2.3 Divisibilité dans ℤ36
2.3.1 Idéal des multiples de a : (a)36
2.3.2 Divisibilité et idéaux de ℤ37
2.3.3 PPCM37
2.3.4 PGCD38
2.3.5 Le Théorème de Gauss40
2.4 PGCD, PPCM et Python (Programmation)41
2.5 Retour aux nombres premiers43
2.6 Exercices44
2.7 Eléments inversibles de Z/nZ48
2.7.1 Indicateur d'Euler48
2.7.2 Petit Théorème de Fermat50
2.8 Applications et pratique50
2.8.1 Cryptographie et algèbre linéaire50
2.8.2 Calcul de ax mod n et le théorème de Fermat51
2.8.3 Test de non primalité52
2.8.4 Calcul de ax « à la main ». Notion de cycle53
3 L'algorithme d'Euclide étendu55
3.1 Présentation de l'algorithme55
3.2 Euclide étendu, inverse de a dans Z/nZ (Programmation)57
3.2.1 Euclide étendu, ou Bezout57
3.2.2 Inverse de a dans Z/nZ58
3.2.3 Python et le package 'galois'58
3.3 Exercices61
4 Le logarithme discret63
4.1 Racine primitive63
4.2 Critère de primalité de Lehmer65
4.3 Racine primitive, grands nombres premiers (Programmation)65
4.3.1 Recherche de racine primitive65
4.3.2 Recherche de grands nombres premiers65
5 Cryptosystèmes69
5.1 Exemples de cryptosystèmes classiques70
5.1.1 Trois exemples70
5.1.2 N-gramme substitution70
5.1.3 Permutation d'ordre d70
5.1.4 Playfair Cipher71
5.1.5 Transformation linéaire71
5.1.6 La machine Enigma71
5.2 Casser un cryptosystème77
5.3 Différents niveaux d'attaque78
5.4 Masque jetable, Vernam (One time pad)79
5.5 Cryptographie quantique80
5.6 La Cryptographie militaire (1883), Kerckhoffs81
5.7 Communication Theory of Secrecy Systems. Shannon82
5.8 Convertir du texte en nombre (Programmation)83
5.9 Python et l'utilisation du code ASCII83
5.10 Python et la conversion texte-nombre84
6 Fonctions à sens unique87
6.1 Fonctions à sens unique87
6.2 Sac à dos, Protocole DH, ..., chiffre de Rabin89
6.2.1 Partage de clés : protocole DH89
6.2.2 Un cryptosystème sans clé90
6.2.3 Algorithme du sac à dos90
6.2.4 Le chiffre de Rabin91
6.3 Implémentation avec Python (Programmation)92
6.3.1 Le sac à dos92
6.3.2 Partage de clés94
6.3.3 Cryptosystème sans clé95
6.4 Le théorème chinois et le chiffre de Rabin (Théorie et programmation)97
6.4.1 Le théorème du reste chinois97
6.4.2 Le chiffre de Rabin99
7 Le RSA et le chiffrement Elgamal103
7.1 Le système RSA103
7.2 RSA et Python (Programmation)105
7.3 Chiffrement Elgamal106
8 Le DES109
8.1 L'algorithme LUCIFER, : notion de ronde109
8.2 Le DES111
8.3 IDEA114
8.4 Modes de chiffrement par bloc. Mode ECB, CBC, CFB, OFB115
8.5 Ou exclusif et addition modulo 2 (Programmation)118
8.6 Addition modulo 216 1199
9 Advanced Encryption Standard (AES)121
9.1 Introduction121
9.2 Les corps finis (Théorie)121
9.2.1 Construction de GF (28)123
9.2.2 L'anneau GF (28)[x]/(x4 + 1)126
9.3 AES126
9.3.1 Les rondes126
9.3.2 La génération des clés de rondes (Key Expansion)128
9.3.3 Déchiffrement128
9.4 Python et le corps de Galois GF (28) (Programmation)129
9.5 Implémentation de PAES (Programmation)132
9.5.1 Le corps de Galois GF(28)132
9.5.2 Les routines132
9.5.3 KeyExpansion136
9.5.4 Le chiffrement138
10 Courbes elliptiques141
10.1 Introduction141
10.2 Courbes elliptiques sur Z/pZ (p premier)143
10.3 Courbes elliptiques sur Z/nZ (n composé)144
10.4 Application à la cryptographie144
10.5 Application à la décomposition des grands nombres145
10.6 Courbes elliptiques et Python (Programmation)147
10.6.1 Courbes elliptiques sur R147
10.6.2 Racine carrée dans Z/pZ148
10.6.3 Courbes elliptiques sur Z/pZ (p premier)149
10.6.4 Courbes sur Z/nZ (n composé)151
11 Fonction de Hachage155
11.1 Protocole155
11.2 Empreinte (Hash Code)156
11.3 KECCAK ou SHA-3158
11.4 Preuve de travail158
11.5 Générateur Pseudo-aléatoire159
12 Protocole ZK : Zero Knowledge161
12.1 Le démon de Quisquater et Guillou161
12.2 Protocole de Fiat-Shamir162
12.3 Graphes et cryptographie163
12.4 Complexité165
13 Identification, Authentification, Signature167
13.1 Authentification168
13.2 Identification169
13.3 Signature171
13.4 Signature Elgamal172
13.5 Conclusion173
14 Horodatage et Blockchain175
14.1 Horodatage175
14.2 Blockchain et le BitCoin177
15 Exemples d'applications de la cryptographie181
15.1 PKI181
15.2 L'argent n'a pas d'odeur183
15.3 Organiser une partie de poker sur internet184
15.4 HTTPS184
15.5 Carte bancaire185
15.6 PGP187
15.7 Voter via internet187
15.8 Chiffrement homomorphe189
15.9 Secret partagé, Clé partagée190
15.10 Le WIFI191
15.11 Chiffrement par flot192
15.12 La lettre recommandée avec AR193
15.13 Tatouage numérique194
15.14 Conclusion196
16 Cryptanalyse197
17 La cryptographie à travers l'histoire199
17.1 L'antiquité199
17.2 La mécanisation200
17.3 Systèmes symétriques200
17.4 Systèmes à clé publique (asymétriques)201
17.5 Mars 2000 : la signature numérique a, valeur légale en France201
Bibliographie203
Index205