◆ Mathématiques · Sécurité · Information ◆
La cryptographie est la science de la protection de l'information par des transformations mathématiques. Elle garantit la confidentialité, l'intégrité, l'authenticité et la non-répudiation des données dans tous les systèmes numériques modernes.
« Il n'y a pas de secret qui ne soit destiné à être découvert. »
— Claude Shannon, Communication Theory of Secrecy Systems, 1949Premières substitutions délibérées de signes — non par secret mais pour intriguer le lecteur. Considérée comme la première forme attestée de chiffrement.
Jules César décale les lettres de l'alphabet d'un nombre fixe (décalage de 3). Premier exemple documenté de chiffrement par substitution monoalphabétique utilisé à des fins militaires.
Le mathématicien arabe Al-Kindi (801–873) invente l'analyse fréquentielle dans son Manuscrit sur le déchiffrement des messages cryptographiques, permettant de casser les substitutions monoalphabétiques.
Blaise de Vigenère publie un chiffre polyalphabétique utilisant une clé de longueur variable. Considéré indéchiffrable pendant 300 ans (le chiffre indéchiffrable), cassé par Babbage et Kasiski en 1863.
Gilbert Vernam invente le chiffre de Vernam (one-time pad). Shannon démontre en 1949 qu'il est le seul système parfaitement sûr au sens de la théorie de l'information, à condition que la clé soit aléatoire, aussi longue que le message et utilisée une seule fois.
Alan Turing et l'équipe de Bletchley Park cassent la machine Enigma nazie. Naissance de l'informatique moderne et de la cryptanalyse systématique. Premiers ordinateurs (Colossus) dédiés au déchiffrement.
Whitfield Diffie et Martin Hellman publient « New Directions in Cryptography », introduisant le concept révolutionnaire de cryptographie à clé publique et l'échange de clés sécurisé sur un canal non sécurisé.
Rivest, Shamir et Adleman publient l'algorithme RSA, première implémentation pratique de la cryptographie asymétrique, basée sur la difficulté de factoriser de grands entiers.
Le NIST adopte Rijndael (Joan Daemen & Vincent Rijmen) comme standard AES après 5 ans de compétition publique. Remplace DES et 3DES. Devenu l'algorithme symétrique le plus déployé au monde.
Le NIST publie FIPS 203 (ML-KEM/Kyber), FIPS 204 (ML-DSA/Dilithium) et FIPS 205 (SLH-DSA) en réponse à la menace des ordinateurs quantiques sur RSA et les courbes elliptiques.
La cryptographie moderne repose sur des bases mathématiques solides — théorie de l'information, théorie des nombres, algèbre et complexité algorithmique.
Un système est parfaitement sûr si la connaissance du chiffrée ne révèle aucune information sur le message clair. Seul le masque jetable (one-time pad) satisfait cette propriété. Nécessite |K| ≥ |M|.
Un chiffrement est sûr IND-CPA si aucun adversaire polynomial ne peut distinguer les chiffrés de deux messages de son choix avec un avantage non négligeable. IND-CCA2 étend la sécurité aux attaques à chiffré choisi adaptatives.
Factorisation : donné n = p·q, retrouver p et q. Base de RSA. Logarithme discret (DLog) : donné g, gx dans un groupe, retrouver x. Base de Diffie-Hellman. LWE (Learning With Errors) : distinguer des équations linéaires bruitées d'un vecteur aléatoire. Base post-quantique.
Fondement de RSA et Diffie-Hellman. a ≡ b (mod n) — l'entier a et b ont le même reste modulo n.
Anneau ℤ/nℤ, groupe multiplicatif ℤn*, ordre d'un élément, théorème d'Euler φ(n).
AES opère dans GF(2⁸) — corps de Galois à 256 éléments. Les opérations de SubBytes, MixColumns sont définies comme des opérations polynomiales dans ce corps.
Groupe abélien sur l'ensemble des points. ECDLP beaucoup plus difficile que DLog classique à taille équivalente : 256 bits ECC ≈ 3072 bits RSA. Base d'ECDSA, ECDH, Ed25519.
La sécurité conditionnelle suppose P ≠ NP (non prouvé). Les hypothèses de difficulté (factorisation, DLog) ne sont basées que sur l'absence d'algorithmes efficaces connus, pas sur une preuve d'impossibilité.
Dans le chiffrement symétrique, la même clé secrète est utilisée pour chiffrer et déchiffrer. Très rapide, mais nécessite un canal sécurisé pour échanger la clé — le problème de distribution de clés.
56 bits de clé, blocs de 64 bits, 16 rounds de Feistel. Standardisé par le NIST en 1977. Cassé par force brute en 1999 (EFF Deep Crack, 22 h). Triple-DES (3DES) le remplace temporairement.
128/192/256 bits de clé, blocs de 128 bits. Réseau de substitution-permutation (SPN). 10/12/14 rounds selon la taille de clé. SubBytes, ShiftRows, MixColumns, AddRoundKey. Aucune attaque pratique connue. Standard mondial.
Chiffrement par XOR avec un flux pseudoaléatoire généré par la clé et un nonce. RC4 (déprécié, biaisé). ChaCha20 (Bernstein, 2008) — utilisé dans TLS 1.3, WireGuard. Plus rapide qu'AES sans accélération matérielle.
Introduite par Diffie et Hellman en 1976, la cryptographie à clé publique résout le problème de la distribution de clés : chaque partie possède une paire (clé publique, clé privée).
Clé publique : (n, e) · Clé privée : d
Chiffrement : C = Mᵉ mod n · Déchiffrement : M = Cᵈ mod n
Sécurité basée sur la difficulté de factoriser n. RSA-2048 : recommandé. RSA-4096 : haute sécurité.
Permet à deux parties de construire un secret partagé sur un canal public sans jamais le transmettre. ECDH utilise des courbes elliptiques : Curve25519 (X25519) est le standard moderne.
Digital Signature Algorithm — basé sur DLog. ECDSA (courbes elliptiques) utilisé dans TLS et Bitcoin. Ed25519 (Edwards-curve DSA) : plus rapide, signatures déterministes, résistant aux failles de génération aléatoire.
Variante de Diffie-Hellman pour le chiffrement. Clé publique : (g, p, gˣ). Utilisé dans PGP/GPG. Sécurité basée sur DLog. Chiffrés deux fois plus longs que les messages.
En pratique : RSA ou ECDH génère un secret de session → AES-GCM chiffre les données. Le meilleur des deux mondes : sécurité asymétrique + performance symétrique. Utilisé dans TLS, PGP, Signal.
from cryptography.hazmat.primitives.asymmetric import rsa, ec, padding from cryptography.hazmat.primitives import hashes, serialization # ── Génération d'une paire RSA-2048 ── private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, ) public_key = private_key.public_key() # Chiffrement OAEP (RSA optimal asymmetric encryption padding) ciphertext = public_key.encrypt( b"Message confidentiel", padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None, ) ) # ── ECDH avec Curve25519 ── alice_priv = ec.generate_private_key(ec.SECP256R1()) bob_priv = ec.generate_private_key(ec.SECP256R1()) shared_secret = alice_priv.exchange( ec.ECDH(), bob_priv.public_key() ) print(f"Secret partagé : {shared_secret.hex()[:32]}...")
Une fonction de hachage H prend un message de taille arbitraire et produit un condensé de taille fixe. Elle doit être résistante aux préimages, aux secondes préimages et aux collisions.
| Algorithme | Sortie (bits) | Construction | Statut |
|---|---|---|---|
| MD5 | 128 | Merkle–Damgård | CASSÉ (collisions 1996) |
| SHA-1 | 160 | Merkle–Damgård | DÉPRÉCIÉ (SHAttered 2017) |
| SHA-256 | 256 | Merkle–Damgård | SÛRE — Standard NIST |
| SHA-3 (Keccak) | 224/256/384/512 | Sponge (éponge) | RECOMMANDÉE — FIPS 202 |
| BLAKE3 | 256 (extensible) | Merkle tree | TRÈS RAPIDE — Moderne |
| Argon2id | variable | Memory-hard | MOTS DE PASSE — Prix PHC |
HMAC (Hash-based Message Authentication Code) : HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M)). Combine hachage et secret partagé pour authentifier l'intégrité d'un message. Utilisé dans JWT, TLS, APIs. HMAC-SHA256 est le standard actuel.
σ = Sign(SK, H(M)). Vérification : Verify(PK, H(M), σ). Garantit authenticité + non-répudiation. Standard : PKCS#7, CAdES, PAdES (PDF), XAdES. Valeur légale en France (eIDAS).
Prouver la connaissance d'un secret sans le révéler. Propriétés : complétude, solidité, zero-knowledge. zk-SNARKs (Groth16), zk-STARKs, Bulletproofs. Applications : blockchain (Zcash), identité anonyme.
n parties calculent f(x₁,…,xₙ) sans révéler leurs entrées individuelles. Secret sharing de Shamir (k-of-n), circuits cryptographiques, protocole BGW. Applications : enchères, vote électronique.
E(a) ⊕ E(b) = E(a+b). Calcul sur données chiffrées sans déchiffrement. Breakthrough : Craig Gentry (2009). Schémas : BGV, BFV, CKKS (flottants), TFHE. Applications : cloud privacy-preserving.
Bitcoin combine SHA-256 (PoW), ECDSA (signatures), arbres de Merkle (intégrité). Ethereum : Keccak-256, Ed25519 dans Ethereum 2.0. Les NFT/smart contracts reposent sur l'immuabilité cryptographique.
Combinaison de X3DH (Extended Triple Diffie-Hellman) et Double Ratchet Algorithm. Forward secrecy + Break-in recovery. Chaque message a une clé éphémère. Utilisé dans Signal, WhatsApp, Messages (Apple).
from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives import hashes import hmac, hashlib # ── Signature ECDSA P-256 ── private_key = ec.generate_private_key(ec.SECP256R1()) message = b"Document a signer : rapport_q4_2024.pdf" signature = private_key.sign(message, ec.ECDSA(hashes.SHA256())) # Vérification (côté destinataire) try: private_key.public_key().verify(signature, message, ec.ECDSA(hashes.SHA256())) print("✓ Signature valide") except Exception: print("✗ Signature invalide !") # ── HMAC-SHA256 ── secret_key = b"cle_secrete_partagee" mac = hmac.new(secret_key, message, hashlib.sha256).hexdigest() print(f"HMAC-SHA256 : {mac}")
L'Infrastructure à Clé Publique (PKI) organise la confiance dans les clés publiques via une hiérarchie de certificats. TLS (Transport Layer Security) en est l'application la plus répandue.
« Un ordinateur quantique suffisamment puissant casserait RSA, ECDSA et Diffie-Hellman en temps polynomial grâce à l'algorithme de Shor. »
— Peter Shor, Polynomial-Time Algorithms for Prime Factorization, 1994L'algorithme de Shor (1994) résout en O(log³n) la factorisation et le logarithme discret sur un ordinateur quantique — rendant obsolètes RSA, DSA, ECDSA et DH. AES et SHA-3 résistent mieux (Grover réduit la sécurité effective de moitié).
Mécanisme d'encapsulation de clé basé sur Module-LWE. Très efficace, petites clés. Variantes : Kyber-512, Kyber-768, Kyber-1024. Standard NIST post-quantique pour le KEM.
Schéma de signature basé sur Module-LWE + Module-SIS. Signatures compactes, vérification rapide. Dilithium2 (sécurité NIST niveau 1), Dilithium3 (niveau 3), Dilithium5 (niveau 5).
Signature à base de hachage uniquement (stateless). Sécurité très conservatrice, pas d'hypothèse algébrique. Signatures plus grandes mais robustesse maximale. Seule alternative si LWE s'avérait faible.
Basé sur des réseaux NTRU (lattice-based). Petites signatures (666 B niveau 1). Génération de clés complexe (FFT sur réseaux gaussiens). Candidat NIST round 4.
Pendant la transition, combiner un algorithme classique (ECDH) avec un algorithme PQ (Kyber). X25519+Kyber768 dans Chrome/Firefox (2023). Un adversaire doit casser les deux pour réussir.
Des adversaires stockent aujourd'hui des communications chiffrées pour les déchiffrer quand un ordinateur quantique sera disponible. Urgence de migrer dès maintenant, surtout pour données sensibles à long terme.
# Générer une paire RSA-4096 openssl genrsa -out private.pem 4096 openssl rsa -in private.pem -pubout -out public.pem # Générer une clé EC (P-256) openssl ecparam -name prime256v1 -genkey -noout -out ec-key.pem # Créer un CSR (Certificate Signing Request) openssl req -new -key private.pem -out request.csr \ -subj "/C=FR/ST=IDF/L=Paris/O=Universite/CN=crypto.univ.fr" # Hacher un fichier openssl dgst -sha256 -sign private.pem -out sig.bin document.pdf openssl dgst -sha256 -verify public.pem -signature sig.bin document.pdf # Chiffrer un fichier AES-256-GCM openssl enc -aes-256-cbc -pbkdf2 -in secret.txt -out secret.enc openssl enc -d -aes-256-cbc -pbkdf2 -in secret.enc -out decrypted.txt # Inspecter un certificat TLS distant echo | openssl s_client -connect example.com:443 2>/dev/null \ | openssl x509 -text -noout | grep -E "Subject:|Not After"