Cryptographie par la pratique avec Python et OpenSSL
Cours et applications concrètes
Rémi Boulle, Stéphane Bortzmeyer
Dunod
Préface1
1 Enjeux et définitions3
1.1 Pourquoi la cryptographie ?3
1.2 Historique4
1.2.1 PGP4
1.2.2 Crypto Wars5
1.2.3 Affaire Snowden6
PRISM6
XkeyScore6
Bullrun7
Conséquences7
1.3 Vocabulaire de la cryptographie8
2 Outils informatiques pour la cryptographie9
2.1 Python pour la cryptographie9
2.1.1 Listes9
Accéder et modifier des éléments10
Slicing de listes11
2.1.2 Dictionnaires11
Création d'un dictionnaire11
2.1.3 Tuple12
2.1.4 Itérateurs et générateurs12
2.1.5 Travailler en binaire13
Opérations bit à bit14
Rotation de bits14
Endianness
15
2.1.6 Unicode16
2.1.7 Congruences16
2.1.8 Fonctions anonymes17
2.1.9 filter, map et reduce17
2.2 Représentations graphiques18
2.2.1 matplotlib en 2D18
2.2.2 matplotlib en 3D avec meshgrid19
2.3 Autres bibliothèques20
2.3.1 pack () et unpack ()20
2.3.2 requests21
2.3.3 JSON21
2.3.4 cryptography22
2.4 SSL/TLS23
2.4.1 OpenSSL23
3 Cryptographie classique25
3.1 Congruences dans ℤ25
3.1.1 Congruences25
3.1.2 Opérations dans ℤ/nℤ26
3.2 César27
3.3 Vigenère28
3.4 Quel bilan ?29
3.5 Exercices31
3.5.1 Chiffrement de César31
3.5.2 Attaques sur le chiffrement de César32
3.5.3 Chiffrement de Vigenère33
3.5.4 Attaque sur le chiffrement de Vigenère34
4 Stéganographie37
4.1 Contexte et historique37
4.2 En ligne de commande38
4.3 Stéganographie sur les fichiers38
4.3.1 Whitespace Steganography38
4.3.2 Stéganographie dans le binaire39
4.4 Stéganographie sur les images39
4.4.1 Stéganographie sur LSB40
4.5 Exercices42
4.5.1 Stéganographie sur les fichiers42
4.5.2 Cacher une image dans une autre43
4.5.3 Cacher du texte dans une image45
5 Hachage47
5.1 Fonction de hachage cryptographique47
5.2 MD549
5.2.1 Padding et extension49
5.2.2 Vue générale50
5.2.3 Fonction de compression52
Fonctions auxiliaires53
Table des constantes53
Décalages54
5.2.4 Zoom sur une opération54
5.2.5 Rondes suivantes54
5.3 SHA-1 et SHA-256
5.4 SHA-357
5.4.1 Construction en éponge57
5.5 Collisions58
5.5.1 Paradoxe des anniversaires60
5.6 Salage et stockage de mot de passes62
5.7 HMAC et KM AC63
5.8 Blockchain63
5.8.1 Qu'est ce qu'un bloc Bitcoin ?64
En-tête de bloc Bitcoin66
Arbre de Merkle68
5.8.2 Minage69
Preuve de travail70
5.9 Exercices72
5.9.1 Inversion de MD572
5.9.2 Implémenter MD572
5.9.3 Dérivation de clé avec PBKDF277
5.9.4 Nombre maximum de bitcoins79
5.9.5 Blockchain79
5.9.6 Arbre de Merkle81
5.9.7 Minage de bitcoins83
6 Chiffrement symétrique87
6.1 Chiffrement par flot87
6.1.1 ChaCha2088
6.1.2 Poly 130588
6.1.3 ChaCha20-Poly 130589
6.2 Modes de chiffrement89
6.2.1 Padding89
6.2.2 Mode ECB90
6.2.3 Mode CBC91
6.2.4 Mode CTR92
6.2.5 Mode GCM93
Chiffrement94
Données authentifiées additionnelles94
Tag d'authenticité94
Déchiffrement et authentification95
Performances96
6.3 Chiffrement de bloc : AES96
6.3.1 Pré-requis mathématiques pour AES97
6.3.2 Opérations usuelles dans GF (28)98
6.3.3 S-box AES100
6.3.4 Chiffrement101
6.3.5 Déchiffrement102
6.3.6 En Python et OpenSSL102
6.4 AES en pratique : LoRaWAN103
6.4.1 LoRaWAN104
6.4.2 Clés de session104
6.4.3 Analyse d'un paquet de données104
6.4.4 Accès à la donnée106
6.4.5 Chiffrement en LoRaWAN107
Un simple XOR ?107
Suite S108
6.5 Cryptographie symétrique légère109
6.6 Exercices110
6.6.1 Division de polynômes110
6.6.2 Mathématiques pour AES110
6.6.3 Analyse d'un paquet LoRaWAN en Python112
6.6.4 Cryptographie en LoRaWAN114
6.6.5 OTP117
6.6.6 AES en mode GCM avec données associées118
7 Cryptographie asymétrique119
7.1 Limitations de la cryptographie symétrique119
7.2 Diffie-Hellman120
7.2.1 Problème de la distribution des clés120
7.2.2 Naissance d'Alice et Bob121
7.2.3 Fonction à sens unique121
7.2.4 Logarithme discret122
7.2.5 Échange de Diffie-Hellman (DH)123
7.2.6 Clés asymétriques124
7.3 Signature numérique125
8 RSA127
8.1 Rappels d'arithmétique127
8.1.1 PGCD127
8.1.2 Algorithme d'Euclide128
8.1.3 Égalité de Bézout129
8.1.4 Algorithme de Blankinship130
8.1.5 Inversion modulo p132
8.2 Nombres premiers132
8.2.1 Répartition des nombres premiers132
8.2.2 Tests de primalité133
Test de Fermat134
Test de Miller-Rabin135
Avec sympy135
Fonction Python isprime ()136
8.3 RSA138
8.3.1 Création des clés139
8.3.2 Choix de l'exposant de chiffrement RSA139
8.3.3 Choix de p et q140
8.3.4 Chiffrement et déchiffrement141
8.3.5 Exponentiation modulaire rapide141
8.4 Preuve de RSA142
8.5 PKCS #1143
8.5.1 Primitives du standard143
I2OSP et OS2IP143
Schéma de chiffrement RSAES-OAEP144
8.6 Signature RSA145
8.7 RSA en Python et OpenSSL145
8.8 Exercices147
8.8.1 Arithmétique pour RSA147
8.8.2 Arithmétique avec Python151
8.8.3 RSA avec Python151
9 Cryptographie sur courbes elliptiques153
9.1 Contexte153
9.2 Courbe elliptique sur ℝ154
9.2.1 Addition155
9.2.2 Multiplication scalaire158
9.3 Courbe elliptique modulo p158
9.3.1 Représentation graphique159
9.3.2 Opérations159
9.4 Cryptographie sur courbes elliptiques160
9.4.1 ECDLP160
9.4.2 Choix des paramètres de la courbe160
9.4.3 Exemples de courbes elliptiques161
9.4.4 Échange de clés : ECDH163
9.4.5 Signature : ECDSA164
9.5 Courbes elliptiques en pratique165
9.5.1 Avec OpenSSL165
9.5.2 Bitcoin165
Adresses Bitcoin166
Courbe secp256k1167
9.6 Exercices169
9.6.1 Opérations sur courbes elliptiques169
9.6.2 Courbe de l'ANSSI171
9.6.3 Chiffrer, déchiffrer172
9.6.4 Secp256kl173
10 Nombres aléatoires175
10.1 Introduction175
10.1.1 PRNG et TRNG176
10.2 PRNG congruentiels linéaires177
10.2.1 Définition177
10.2.2 Choix des paramètres178
10.3 Mersenne Twister179
10.3.1 Description180
Twisting
180
Tempering
182
10.3.2 MT19937182
10.3.3 Qualité et sécurité de MT184
10.4 Qualité184
10.4.1 Test du khi-deux185
10.4.2 Test spectral187
10.4.3 Test du birthday spacing189
10.5 Générateurs cryptographiques190
10.6 Exercices191
10.6.1 GCL191
10.6.2 Test spectral193
10.6.3 Mersenne Twister194
11 HTTPS et SSH197
11.1 HTTPS197
11.1.1 Contexte et historique198
EFF198
Google et Wikipédia pour HTTPS198
Let's encrypt
199
11.1.2 TLS 1.3199
Client Hello
200
Server Hello
201
Calcul de la clé du Handshake202
Encrypted Extensions
202
Certificat202
Fin du Handshake203
11.2 SSH204
11.2.1 Origines204
11.2.2 Protocole SSH205
11.2.3 Clés SSH206
11.2.4 Connexion SSH aux rayons X206
Bibliographie210
Index214