security cryptography ecc rsa encryption web-security

Guide des courbes elliptiques et de la cryptographie asymétrique avancée

Un guide complet sur la cryptographie asymétrique moderne : comparaison des variantes RSA (OAEP, PSS) avec la cryptographie sur courbes elliptiques (ECDSA, Ed25519), l'échange de clés (X25519) et la dérivation de clés (HKDF).

2026-04-11

Introduction à la cryptographie asymétrique

La cryptographie asymétrique, ou cryptographie à clé publique, est la pierre angulaire de la sécurité numérique moderne. Contrairement au chiffrement symétrique où une seule clé est partagée, les systèmes asymétriques utilisent une paire de clés : une clé publique pour le chiffrement ou la vérification de signature, et une clé privée pour le déchiffrement ou la signature.

Ce guide explore l'évolution du RSA traditionnel vers la cryptographie sur courbes elliptiques (ECC) moderne, couvrant des standards comme Ed25519, X25519 et des schémas avancés comme RSA-PSS et HKDF.


1. Variantes RSA : OAEP, PSS et PKCS1-v1.5

Le RSA (Rivest–Shamir–Adleman) est le standard de l'industrie depuis des décennies. Cependant, la manière dont le RSA est implémenté importe considérablement pour la sécurité.

RSA-PKCS1-v1.5 (Le standard hérité)

Le plus ancien schéma de remplissage (padding). Bien qu'encore largement utilisé, il est vulnérable aux attaques par oracle de remplissage (comme l'attaque de Bleichenbacher). Il est généralement déconseillé pour les nouvelles applications.

RSA-OAEP (Optimal Asymmetric Encryption Padding)

Utilisé pour le chiffrement. L'OAEP ajoute un remplissage basé sur un réseau de Feistel qui offre une « conscience du texte clair ». Il empêche un attaquant de modifier le texte chiffré pour obtenir des informations sur le texte clair.

  • Recommandation : Utilisez RSA-OAEP au lieu de PKCS1-v1.5 pour chiffrer les données.

RSA-PSS (Probabilistic Signature Scheme)

Utilisé pour les signatures numériques. Contrairement aux schémas plus anciens, le PSS est prouvé sûr dans le modèle de l'oracle aléatoire. Il ajoute un sel au processus de signature, le rendant probabiliste plutôt que déterministe.

  • Recommandation : Les protocoles modernes comme TLS 1.3 exigent ou préfèrent fortement les signatures RSA-PSS aux anciennes signatures PKCS1-v1.5.

2. Plongée dans la cryptographie sur courbes elliptiques (ECC)

L'ECC offre le même niveau de sécurité que le RSA mais avec des clés beaucoup plus petites. Par exemple, une clé ECC de 256 bits est approximativement équivalente à une clé RSA de 3072 bits.

ECDSA (Elliptic Curve Digital Signature Algorithm)

L'analogue sur courbe elliptique de l'algorithme de signature numérique (DSA).

  • ECDSA-P256 : La courbe NIST la plus courante. Largement supportée, mais certains s'inquiètent de possibles « portes dérobées » dans les paramètres NIST.
  • ECDSA-P384 : Utilisé pour les niveaux de sécurité plus élevés (Top Secret).

EdDSA et courbes d'Edwards tordues

La cryptographie moderne s'oriente vers l'EdDSA (Edwards-curve Digital Signature Algorithm).

  • Ed25519 : Basé sur la Curve25519. Il est conçu pour une vitesse et une sécurité élevées. Il est déterministe (pas besoin de générateur de nombres aléatoires lors de la signature), ce qui élimine une source courante d'échecs catastrophiques dans l'ECDSA.
  • Ed448 : Une courbe « Boucles d'or » (Goldilocks) offrant une sécurité encore plus élevée (niveau de sécurité de 224 bits) que l'Ed25519.

3. Protocoles d'échange de clés

Comment deux parties établissent-elles un secret partagé sur un canal non sécurisé ?

Diffie-Hellman (DH)

Le protocole original d'échange de clés. Aujourd'hui, il est principalement remplacé par sa version sur courbes elliptiques.

ECDH (Elliptic Curve Diffie-Hellman)

  • ECDH-P256 / P384 : Utilisation des courbes NIST pour établir des secrets.
  • X25519 : Le standard d'or moderne pour l'échange de clés. C'est une fonction ECDH utilisant la Curve25519. Elle est plus rapide, plus sûre et plus facile à implémenter correctement que les courbes NIST.
  • X448 : Le pendant à haute sécurité de X25519.

4. Dérivation de clés : HKDF

Une fois qu'un secret partagé est établi (par exemple via X25519), il ne doit pas être utilisé directement comme clé de chiffrement. À la place, nous utilisons une fonction de dérivation de clé (KDF).

HKDF-SHA256 (HMAC-based Extract-and-Expand KDF)

Le HKDF suit un processus en deux étapes :

  1. Extract (Extraction) : Prend le secret partagé « brut » et un sel optionnel pour produire une « clé pseudo-aléatoire » (PRK).
  2. Expand (Expansion) : Transforme cette PRK en plusieurs clés des longueurs souhaitées (par exemple, une clé AES et un IV).

L'utilisation de HKDF-SHA256 garantit que les clés finales sont cryptographiquement fortes et indépendantes.


5. Tableau comparatif

Algorithme Taille de clé (Sécurité) Performance Standard Cas d'utilisation
RSA 2048 112 bits Lent Hérité Compatibilité
RSA 3072 128 bits Très lent Fort Hérité/Entreprise
ECDSA-P256 128 bits Rapide NIST Mobile/Web général
Ed25519 128 bits Très rapide Moderne Recommandé pour signatures
X25519 128 bits Très rapide Moderne Recommandé pour échange de clés
Ed448 224 bits Moyen Haute séc Systèmes ultra-sécurisés

6. Recommandations de sécurité : pourquoi Ed25519 ?

Pourquoi les experts délaissent-ils le RSA et les courbes NIST pour l'Ed25519 ?

  1. Résilience aux attaques par canaux auxiliaires : Les implémentations d'Ed25519 sont souvent à temps constant par conception, protégeant contre les attaques temporelles.
  2. Pas d'aléatoire « malchanceux » : L'ECDSA nécessite un nombre aléatoire frais et de haute qualité pour chaque signature. Si ce générateur (RNG) échoue même légèrement, votre clé privée peut être récupérée. L'Ed25519 est déterministe et évite totalement ce problème.
  3. Performance : L'Ed25519 est nettement plus rapide pour la signature et la vérification, ce qui est critique pour les serveurs à fort trafic.
  4. Petites clés : Les clés de 32 octets sont beaucoup plus faciles à gérer dans les codes QR, les index de base de données et les en-têtes que les clés RSA de 512 octets.

7. Exemples de code

Node.js : Signature Ed25519

Utilisation du module crypto intégré :

const crypto = require('crypto');

// Générer une paire de clés Ed25519
const { privateKey, publicKey } = crypto.generateKeyPairSync('ed25519');

const message = Buffer.from('Bonjour, Sécurité !');

// Signer
const signature = crypto.sign(null, message, privateKey);

// Vérifier
const isVerified = crypto.verify(null, message, publicKey, signature);
console.log('Signature vérifiée :', isVerified);

Python : Échange de clés X25519

Utilisation de la bibliothèque cryptography :

from cryptography.hazmat.primitives.asymmetric import x25519

# Côté Alice
alice_private = x25519.X25519PrivateKey.generate()
alice_public = alice_private.public_key()

# Côté Bob
bob_private = x25519.X25519PrivateKey.generate()
bob_public = bob_private.public_key()

# Calcul du secret partagé
alice_shared = alice_private.exchange(bob_public)
bob_shared = bob_private.exchange(alice_public)

assert alice_shared == bob_shared
print("Secret partagé établi !")

8. FAQ : Pièges courants

Q : Puis-je utiliser la même clé pour RSA-OAEP et RSA-PSS ?

A : Techniquement possible, mais fortement déconseillé. Utiliser la même clé à des fins différentes (chiffrement et signature) peut mener à des attaques inter-protocoles. Utilisez toujours des clés distinctes pour des rôles distincts.

Q : L'Ed25519 est-il résistant au quantique ?

A : Non. Comme le RSA et tous les ECC actuels, l'Ed25519 est vulnérable aux ordinateurs quantiques à grande échelle utilisant l'algorithme de Shor. Pour la résistance quantique, vous devriez vous tourner vers la cryptographie post-quantique (PQC) comme ML-KEM ou ML-DSA.

Q : Pourquoi utiliser SHA-256 avec HKDF ?

A : Le SHA-256 offre une marge de sécurité élevée et est supporté mondialement. Bien que le SHA-3 ou BLAKE2 soient excellents, le SHA-256 reste le standard de l'industrie pour l'implémentation du HKDF.


Résumé

La transition du RSA vers la cryptographie sur courbes elliptiques représente un bond majeur tant en sécurité qu'en efficacité. Pour les applications modernes :

  • Utilisez Ed25519 pour les signatures numériques.
  • Utilisez X25519 pour l'échange de clés.
  • Utilisez HKDF-SHA256 pour la dérivation de clés.
  • N'utilisez RSA-OAEP/PSS que si la compatibilité avec l'existant est strictement requise.

En adoptant ces standards modernes, vous garantissez que votre application est rapide, sécurisée et alignée sur les meilleures pratiques cryptographiques actuelles.