Retour au cours

cyber / cybersecurite-fondamentale

Cryptographie : chiffrement symétrique

Leçon 61 exercice

Explication

Ce que vous allez apprendre

  • Expliquer le principe du chiffrement symétrique et pourquoi il reste le plus rapide pour de gros volumes
  • Distinguer les modes d'opération ECB, CBC et GCM et savoir pourquoi ECB est à bannir
  • Comprendre pourquoi un nonce/IV réutilisé casse totalement la sécurité du mode GCM
  • Dériver une clé de chiffrement à partir d'un mot de passe utilisateur avec PBKDF2
  • Distinguer chiffrement au repos (AES) et chiffrement en transit (TLS)

Dans quel contexte ?

Une équipe doit chiffrer les sauvegardes quotidiennes d'une base de données contenant des numéros de carte bancaire avant de les envoyer vers un stockage cloud tiers. Si elle choisit AES en mode ECB, ou si elle réutilise le même nonce à chaque sauvegarde, les fichiers chiffrés laisseront filtrer des motifs exploitables par quiconque intercepterait le stockage. Le choix du mode d'opération n'est donc pas un détail technique, c'est ce qui décide si la sauvegarde protège vraiment les données.

Première étape : l'idée de base. Le chiffrement symétrique repose sur un principe simple : la même clé sert à verrouiller et à déverrouiller, comme une clé de maison classique. C'est rapide et efficace, parfaitement adapté à de gros volumes de données.

Il reste un problème évident. Comment transmettre cette clé à la bonne personne sans qu'elle soit interceptée en chemin ? Si quelqu'un vole la clé pendant son transport, tout l'édifice s'effondre. Cette question sera résolue dans la leçon suivante avec le chiffrement asymétrique, patientez un peu.

Deuxième étape : choisir l'algorithme ne suffit pas. On pourrait croire que choisir AES règle tout. En réalité il faut aussi décider COMMENT chiffrer bloc après bloc, ce qu'on appelle le mode d'opération.

Voyons d'abord le mauvais exemple : le mode ECB. Ce mode historique chiffre chaque bloc indépendamment des autres. Résultat, deux blocs identiques produisent le même chiffré, ce qui laisse apparaître des motifs visibles. L'exemple classique est une image chiffrée en ECB où l'on distingue encore les contours de l'original.

ModeSécuritéÀ utiliser ?
ECBMotifs visibles, aucune diffusionJamais
CBCCorrect si l'IV est aléatoire et uniqueAcceptable, mais sans authentification intégrée
GCMChiffre ET authentifie (AEAD)Recommandé par défaut

Voici la solution recommandée aujourd'hui : le mode GCM. Il corrige ce défaut et ajoute, en prime, une vérification automatique d'authenticité. C'est pourquoi il est recommandé par défaut dans presque tous les cas modernes.

Piège fréquent

Un nonce (ou IV) doit être unique à chaque chiffrement effectué avec une même clé. Ce n'est pas une précaution cosmétique : réutiliser un nonce en mode GCM permet mathématiquement à un attaquant de retrouver le flux de chiffrement et de falsifier des messages. La règle à retenir est simple : toujours générer un nonce aléatoire à chaque appel, jamais le coder en dur.

Bonne pratique

Un mot de passe choisi par un humain n'a pas assez d'entropie pour servir directement de clé AES. Faites-le toujours passer par une fonction de dérivation, comme PBKDF2 ou Argon2, qui l'étire et le renforce avant de l'utiliser comme clé de chiffrement.

Pour finir, un repère à garder en tête pour la suite. Le chiffrement au repos, pour les données stockées, utilise AES. Le chiffrement en transit, pour les données qui circulent sur le réseau, utilise TLS. Ce sont deux couches différentes et complémentaires, pas une alternative l'une à l'autre.

Il reste maintenant à résoudre le problème laissé en suspens plus haut : partager une clé secrète sans jamais l'envoyer en clair. C'est exactement ce que permet la cryptographie asymétrique, dans la prochaine leçon.

Commandes & code

Cryptographie : chiffrement symétrique

Le chiffrement symétrique utilise une seule clé pour chiffrer et déchiffrer. Rapide, adapté aux gros volumes de données, mais pose le problème de la distribution de la clé.

text
# Algorithmes symétriques
AES (Advanced Encryption Standard) : standard actuel, clés 128/192/256 bits
ChaCha20-Poly1305                  : alternative moderne, rapide sans accélération matérielle (mobile)
DES / 3DES                          : OBSOLÈTES, clé trop courte (56 bits), ne plus utiliser

# Modes d'opération (comment appliquer le chiffrement bloc par bloc)
ECB : Electronic Codebook   -> JAMAIS utiliser (motifs visibles, pas de diffusion)
CBC : Cipher Block Chaining -> nécessite un IV aléatoire unique par message
GCM : Galois/Counter Mode   -> AEAD (chiffre ET authentifie), RECOMMANDÉ par défaut
python
# AES-256-GCM avec la librairie cryptography (mode AEAD : confidentialité + intégrité)
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

key = AESGCM.generate_key(bit_length=256)  # à stocker dans un coffre-fort de secrets (vault)
aesgcm = AESGCM(key)

nonce = os.urandom(12)  # 96 bits, DOIT être unique pour chaque chiffrement avec la même clé
plaintext = b"Numero de carte: XXXX-XXXX-XXXX-1234"
associated_data = b"user_id=42"  # authentifié mais pas chiffré (ex: métadonnées de routage)

ciphertext = aesgcm.encrypt(nonce, plaintext, associated_data)

# Le déchiffrement échoue (exception) si le ciphertext, le nonce ou l'AAD ont été altérés
decrypted = aesgcm.decrypt(nonce, ciphertext, associated_data)
assert decrypted == plaintext
python
# Piège classique : réutiliser un nonce avec la même clé casse TOTALEMENT la sécurité de GCM
# (permet de retrouver le keystream et de forger des messages)
import os

def encrypt_record(aesgcm, plaintext: bytes, aad: bytes) -> dict:
    nonce = os.urandom(12)  # généré à CHAQUE appel, jamais réutilisé ni codé en dur
    ciphertext = aesgcm.encrypt(nonce, plaintext, aad)
    return {"nonce": nonce.hex(), "ciphertext": ciphertext.hex()}

# Stocker nonce + ciphertext ensemble (le nonce n'est pas secret, juste unique)
python
# Dérivation de clé à partir d'un mot de passe utilisateur (jamais utiliser le mot de passe brut comme clé)
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
import os

def derive_key_from_password(password: str, salt: bytes | None = None) -> tuple[bytes, bytes]:
    salt = salt or os.urandom(16)
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=salt, iterations=600_000)
    key = kdf.derive(password.encode())
    return key, salt
bash
# Chiffrement symétrique en ligne de commande avec openssl (ex: sauvegarde chiffrée d'un dump SQL)
openssl enc -aes-256-gcm -salt -pbkdf2 -iter 200000   -in backup_technologik.sql -out backup_technologik.sql.enc -pass file:./backup.key

# Déchiffrement
openssl enc -d -aes-256-gcm -pbkdf2 -iter 200000   -in backup_technologik.sql.enc -out backup_technologik.sql -pass file:./backup.key
text
# Chiffrement au repos vs en transit
Au repos (at rest)  : disque, base de données, sauvegardes -> AES-256, gestion de clé via KMS/Vault
En transit           : réseau -> TLS 1.2/1.3 (voir leçon dédiée asymétrique/TLS)

# Rotation des clés : ne jamais garder la même clé indéfiniment
1. Générer une nouvelle clé (versionnée: key_v2)
2. Chiffrer les nouvelles données avec key_v2
3. Re-chiffrer progressivement les anciennes données (rewrap) en tâche de fond
4. Révoquer key_v1 une fois la migration terminée et auditée

Résumé

  • AES-256-GCM (AEAD) est le choix par défaut : confidentialité + intégrité en une passe.
  • Un nonce/IV ne doit JAMAIS être réutilisé avec la même clé en mode GCM/CBC.
  • Ne jamais utiliser un mot de passe brut comme clé : dériver via PBKDF2/Argon2/scrypt.
  • Séparer chiffrement au repos (AES) et en transit (TLS), avec rotation périodique des clés.

Exercices pratiques

1 disponible
1

Mission : auditer le chiffrement des sauvegardes bancaires

Objectif : Repérer les erreurs de mode d'opération et de gestion de nonce dans un script de sauvegarde chiffrée, puis les corriger.

Contexte

Technologik chiffre chaque nuit un dump SQL contenant des numéros de carte bancaire avant de l'envoyer vers un stockage cloud tiers. Le script actuel utilise AES en mode ECB, et un développeur a codé le nonce en dur dans une constante pour "simplifier le débogage".

Résoudre l’exercice →