Cryptographie

Cryptographie

Chiffrement symétrique, asymétrique, hashing, signatures numériques et PKI

chiffrementhashingrsaaestlscertificats

Chiffrement symétrique

Une seule clé pour chiffrer et déchiffrer.

AlgorithmeTaille de cléUsage
AES-256-GCM256 bitsStandard actuel, chiffrement au repos
ChaCha20-Poly1305256 bitsAlternative à AES, mobile
DES56 bitsObsolète — ne pas utiliser
3DES168 bitsDéprécié — ne pas utiliser
$openssl enc -aes-256-cbc -salt -in fichier.txt -out fichier.enc
Chiffrer un fichier avec AES-256
$openssl enc -d -aes-256-cbc -in fichier.enc -out fichier.txt
Déchiffrer

Chiffrement asymétrique

Paire de clés : publique (chiffrer) et privée (déchiffrer).

AlgorithmeUsageTaille recommandée
RSAChiffrement, signatures4096 bits
ECDSASignatures (plus rapide)P-256 ou P-384
Ed25519Signatures SSH/TLS256 bits
X25519Échange de clés256 bits
$ssh-keygen -t ed25519 -C '[email protected]'
Générer une clé SSH Ed25519
$openssl genrsa -out private.pem 4096
Générer une clé RSA 4096 bits
$openssl rsa -in private.pem -pubout -out public.pem
Extraire la clé publique

Hashing

Fonction à sens unique : impossible de retrouver l'entrée à partir du hash.

AlgorithmeTailleUsage
SHA-256256 bitsVérification d'intégrité
SHA-3VariableNouvelle génération
BLAKE3256 bitsRapide, moderne
MD5128 bitsCasse — ne pas utiliser
SHA-1160 bitsCasse — ne pas utiliser
$sha256sum fichier.iso
Calculer le hash SHA-256 d'un fichier

Hashing de mots de passe

Les fonctions de hashing classiques (SHA-256) sont trop rapides pour les mots de passe. Utiliser des fonctions conçues pour être lentes :

AlgorithmeRecommandation
Argon2idRecommandé (winner PHC)
bcryptBon choix, largement supporté
scryptAlternative solide
PBKDF2Acceptable si pas d'alternative

Signatures numériques

Prouver l'authenticité et l'intégrité d'un message.

1. Alice hash le message → H
2. Alice chiffre H avec sa clé privée → Signature
3. Alice envoie message + signature
4. Bob déchiffre la signature avec la clé publique d'Alice → H'
5. Bob hash le message reçu → H''
6. Si H' == H'' → message authentique et intègre
$openssl dgst -sha256 -sign private.pem -out signature.bin message.txt
Signer un fichier
$openssl dgst -sha256 -verify public.pem -signature signature.bin message.txt
Vérifier une signature

TLS (Transport Layer Security)

Handshake TLS 1.3

Client                              Server
  │                                    │
  ├── ClientHello (ciphers, key) ────→ │
  │                                    │
  │ ←── ServerHello + Certificate ─────┤
  │ ←── Finished ──────────────────────┤
  │                                    │
  ├── Finished ──────────────────────→ │
  │                                    │
  │ ←═══ Encrypted traffic ══════════→ │
  • TLS 1.3 : 1-RTT handshake, forward secrecy obligatoire
  • TLS 1.2 : acceptable mais 2-RTT
  • TLS 1.0/1.1 : déprécié, à désactiver
  • SSL : obsolète depuis 2015

PKI et certificats

Chaîne de confiance

Root CA (auto-signé, stocké dans l'OS/navigateur)
  └── Intermediate CA (signé par Root CA)
        └── Certificat serveur (signé par Intermediate CA)
$openssl x509 -in cert.pem -text -noout
Examiner un certificat
$openssl s_client -connect example.com:443 -servername example.com
Vérifier le certificat d'un serveur

Let's Encrypt (ACME)

$certbot certonly --standalone -d example.com
Obtenir un certificat gratuit Let's Encrypt

Bonnes pratiques

  • AES-256-GCM ou ChaCha20 pour le chiffrement symétrique
  • Ed25519 pour les clés SSH
  • Argon2id pour les mots de passe
  • TLS 1.3 minimum pour le trafic réseau
  • Ne jamais implémenter sa propre cryptographie
  • Rotation régulière des clés et certificats