🔑
Cryptographie
Cryptographie : chiffrer ses données efficacement
📅 2025-03-18 ⏱ 10 min de lecture 🏷 Intermédiaire

// SOMMAIRE

Cryptographie : chiffrer ses données efficacement

La cryptographie est la science du secret. Elle protège vos communications, vos mots de passe, vos transactions bancaires et vos données stockées. Comprendre ses bases vous permet de faire des choix éclairés pour sécuriser vos informations.

Qu'est-ce que la cryptographie ?

La cryptographie transforme des données lisibles (texte en clair) en données illisibles (texte chiffré) à l'aide d'un algorithme et d'une clé. Seul quelqu'un possédant la bonne clé peut déchiffrer le message.

Texte clair  : "Mot de passe : Admin123"

+

Algorithme : AES-256

+

Clé secrète : x7K#mP9$qL2@nR5v

Texte chiffré: 8f3a2b1c9d4e5f6a7b8c9d0e1f2a3b4c

Les deux grandes familles de chiffrement

Chiffrement symétrique

La même clé sert à chiffrer ET à déchiffrer. C'est rapide et efficace pour de grandes quantités de données.

Expéditeur                    Destinataire

| |

|--- [CLÉ SECRÈTE PARTAGÉE] ---|

| |

Chiffre avec la clé Déchiffre avec la clé

Algorithmes principaux :

| Algorithme | Taille clé | Usage |

|------------|-----------|-------|

| AES-128 | 128 bits | Standard actuel |

| AES-256 | 256 bits | Haute sécurité |

| ChaCha20 | 256 bits | Mobile/embarqué |

| 3DES | 168 bits | Obsolète (éviter) |

Problème : comment partager la clé secrète de façon sécurisée ?

# Exemple de chiffrement AES en Python

from Crypto.Cipher import AES

from Crypto.Random import get_random_bytes

import base64

Générer une clé aléatoire

cle = get_random_bytes(32) # 256 bits

Chiffrer

cipher = AES.new(cle, AES.MODE_GCM)

texte_chiffre, tag = cipher.encrypt_and_digest(b"Message secret")

print(f"Chiffré : {base64.b64encode(texte_chiffre).decode()}")

Chiffrement asymétrique

Utilise deux clés mathématiquement liées :

Clé publique de Bob

Alice chiffre le message ──→ Message chiffré ──→ Bob déchiffre

avec sa clé privée

Analogie : la clé publique est comme un cadenas ouvert que vous distribuez. N'importe qui peut fermer le cadenas (chiffrer), mais seul vous avez la clé pour l'ouvrir (déchiffrer).

Algorithmes principaux :

| Algorithme | Usage | Recommandation |

|------------|-------|----------------|

| RSA-2048 | Chiffrement, signatures | Acceptable |

| RSA-4096 | Chiffrement haute sécurité | Recommandé |

| ECDSA | Signatures numériques | Excellent |

| Ed25519 | SSH, signatures | Meilleur choix actuel |

# Générer une paire de clés RSA avec OpenSSL

openssl genrsa -out cle_privee.pem 4096

openssl rsa -in cle_privee.pem -pubout -out cle_publique.pem

Chiffrer un fichier avec la clé publique

openssl rsautl -encrypt -pubin -inkey cle_publique.pem \

-in message.txt -out message_chiffre.bin

Déchiffrer avec la clé privée

openssl rsautl -decrypt -inkey cle_privee.pem \

-in message_chiffre.bin -out message_dechiffre.txt

La combinaison : chiffrement hybride

En pratique, on combine les deux :

  • On génère une clé symétrique aléatoire (rapide pour chiffrer les données)
  • On chiffre cette clé avec la clé publique du destinataire (asymétrique)
  • C'est exactement ce que fait TLS/HTTPS !

    Les fonctions de hachage

    Une fonction de hachage transforme n'importe quelle donnée en une empreinte de taille fixe. Ce n'est pas du chiffrement car c'est irréversible — on ne peut pas retrouver la donnée originale.

    "Bonjour"        → SHA-256 → 7f83b1657ff1fc53b92dc18148a1d65...
    

    "Bonjour." → SHA-256 → ef0c748df4da50a8d6b284f7ca943...

    "bonjour" → SHA-256 → 9b74c9897bac770ffc029102a200c5...

    Propriétés importantes :

    Algorithmes :

    | Algorithme | Taille | Statut |

    |------------|--------|--------|

    | MD5 | 128 bits | ⛔ Cassé, ne plus utiliser |

    | SHA-1 | 160 bits | ⛔ Cassé, ne plus utiliser |

    | SHA-256 | 256 bits | ✅ Standard actuel |

    | SHA-3 | Variable | ✅ Excellent |

    | bcrypt | Variable | ✅ Idéal pour mots de passe |

    Hachage des mots de passe

    Les mots de passe ne doivent jamais être stockés en clair. On stocke leur empreinte.

    import bcrypt
    
    

    Hacher un mot de passe (avec salt automatique)

    mot_de_passe = b"MonMotDePasse123"

    hash_mdp = bcrypt.hashpw(mot_de_passe, bcrypt.gensalt(rounds=12))

    print(f"Hash stocké : {hash_mdp}")

    Hash stocké : $2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/...

    Vérifier un mot de passe

    if bcrypt.checkpw(mot_de_passe, hash_mdp):

    print("Mot de passe correct !")

    > Pourquoi bcrypt et pas SHA-256 ? bcrypt est intentionnellement lent, ce qui rend les attaques par force brute très coûteuses en temps.

    Les signatures numériques

    Une signature numérique prouve l'authenticité et l'intégrité d'un document. Elle utilise la clé privée pour signer et la clé publique pour vérifier.

    Alice signe :
    

    Document + Clé privée d'Alice → Signature numérique

    Bob vérifie :

    Document + Signature + Clé publique d'Alice → Valide / Invalide

    Utilisations :

    # Signer un fichier avec GPG
    

    gpg --sign --armor document.pdf

    Vérifier une signature

    gpg --verify document.pdf.asc

    TLS/HTTPS : la cryptographie en action

    Quand vous vous connectez à un site HTTPS, voici ce qui se passe en coulisses :

    1. Votre navigateur → Serveur : "Bonjour, je supporte TLS 1.3"
    
  • Serveur → Navigateur : Certificat (clé publique + identité)
  • Navigateur : Vérifie le certificat auprès d'une autorité de confiance
  • Échange de clés : Génération d'une clé de session secrète
  • Communication chiffrée avec AES-256
  • Vérifier un certificat SSL :

    # Via la ligne de commande
    

    openssl s_client -connect google.com:443 -showcerts

    Voir les détails du certificat

    echo | openssl s_client -connect google.com:443 2>/dev/null | \

    openssl x509 -noout -text

    Bonnes pratiques cryptographiques

    Ce qu'il faut faire ✅

    Ce qu'il faut éviter ❌

    # ❌ NE JAMAIS faire ça
    

    import hashlib

    mot_de_passe_hash = hashlib.md5("MonMotDePasse".encode()).hexdigest()

    MD5 est cassé et instantanément reversible avec des rainbow tables

    ❌ Clé codée en dur dans le code

    CLE_SECRETE = "motdepasse123" # Visible dans le code source !

    ❌ Chiffrement maison

    def mon_chiffrement(texte):

    return ''.join(chr(ord(c) + 3) for c in texte) # César de César !

    Conclusion

    La cryptographie est partout — dans votre navigateur, votre téléphone, vos applications bancaires. Retenez l'essentiel : AES-256 pour stocker, RSA/ECC pour échanger, bcrypt pour les mots de passe, SHA-256 pour vérifier l'intégrité. Et surtout, n'inventez jamais votre propre algorithme de chiffrement — utilisez toujours des implémentations éprouvées.

    💬 Voir l'article avec commentaires →
    ← Phishing : reconnaître et éviter les pièges Introduction au pentesting éthique →