Prérequis
Aucun — peut être commencé dès le premier jour en parallèle de tout le reste.
Ce qui doit être fait
Un script Python (ou Java avec Bouncy Castle) qui exécute un échange de clés hybride P-256 + ML-KEM-768 et prouve que les deux parties arrivent au même secret.
Ce changement nécessitera beaucoup de changements à la documentation afin d'expliquer toutes les recherches et l'application théorique de ce qu'on a fait.
Réponse du professeur
On veut démontrer qu’un échange hybride (ex. ECDH P‑256 + ML‑KEM‑768) fonctionne réellement, avec deux secrets partiels combinés (idéalement via HKDF( HMAC-based Key Derivation Function) pour produire un secret final commun utilisé pour la session. La démo doit prouver que les deux mécanismes sont bien exécutés et que le secret final sert effectivement à sécuriser un échange (message chiffré ou session TLS par ex).
Théorie complète de l'échange hybride
-
Alice génère deux paires de clés :
(priv_ecdh_a, pub_ecdh_a) : paire ECDH P-256
(priv_mlkem_a, pub_mlkem_a) : paire ML-KEM-768
-
Bob génère sa paire ECDH et encapsule pour ML-KEM :
(priv_ecdh_b, pub_ecdh_b) : paire ECDH P-256
(ciphertext, K_mlkem_bob) = ML-KEM.Encapsulate(pub_mlkem_a)
- Bob envoie
pub_ecdh_b + ciphertext à Alice
-
Les deux calculent le secret ECDH :
K_ecdh = ECDH(priv_ecdh_a, pub_ecdh_b) (Alice)
K_ecdh = ECDH(priv_ecdh_b, pub_ecdh_a) (Bob)
- Par propriété ECDH : les deux obtiennent la même valeur
-
Alice décapsule ML-KEM :
K_mlkem_alice = ML-KEM.Decapsulate(priv_mlkem_a, ciphertext)
-
Les deux dérivent le secret final :
secret = HKDF-SHA256(K_ecdh ‖ K_mlkem, salt="q-ready-hybrid-v1")
-
Vérification : secret_alice == secret_bob → True ✅
Implémentation Python recommandée :
from cryptography.hazmat.primitives.asymmetric.ec import ECDH, generate_private_key, SECP256R1
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import oqs # ou kyber depuis une lib Python
Si oqs n'est pas disponible, utiliser pqcrypto ou une implémentation pure-Python de ML-KEM-768 (acceptable pour une démo pédagogique).
Output attendu :
[Alice] Génération des clés ECDH P-256... ✓ (0.3ms)
[Alice] Génération des clés ML-KEM-768... ✓ (1.2ms)
[Bob] Calcul ECDH... ✓
[Bob] Encapsulation ML-KEM... ✓ (1.8ms)
[Alice] Décapsulation ML-KEM... ✓ (0.9ms)
[Both] Dérivation HKDF... ✓
Algorithmes : ECDH P-256 (classique) + ML-KEM-768 (FIPS 203)
Secret ECDH (hex) : a3f2b19c...
Secret ML-KEM (hex) : 7e41d20f...
Secret hybride (hex): 9c2e4a81...
✅ Alice et Bob ont dérivé le même secret : OUI
⚡ Résistant aux attaques classiques ET post-quantiques
Prérequis
Aucun — peut être commencé dès le premier jour en parallèle de tout le reste.
Ce qui doit être fait
Un script Python (ou Java avec Bouncy Castle) qui exécute un échange de clés hybride P-256 + ML-KEM-768 et prouve que les deux parties arrivent au même secret.
Ce changement nécessitera beaucoup de changements à la documentation afin d'expliquer toutes les recherches et l'application théorique de ce qu'on a fait.
Réponse du professeur
On veut démontrer qu’un échange hybride (ex. ECDH P‑256 + ML‑KEM‑768) fonctionne réellement, avec deux secrets partiels combinés (idéalement via HKDF( HMAC-based Key Derivation Function) pour produire un secret final commun utilisé pour la session. La démo doit prouver que les deux mécanismes sont bien exécutés et que le secret final sert effectivement à sécuriser un échange (message chiffré ou session TLS par ex).
Théorie complète de l'échange hybride
Alice génère deux paires de clés :
(priv_ecdh_a, pub_ecdh_a): paire ECDH P-256(priv_mlkem_a, pub_mlkem_a): paire ML-KEM-768Bob génère sa paire ECDH et encapsule pour ML-KEM :
(priv_ecdh_b, pub_ecdh_b): paire ECDH P-256(ciphertext, K_mlkem_bob)=ML-KEM.Encapsulate(pub_mlkem_a)pub_ecdh_b+ciphertextà AliceLes deux calculent le secret ECDH :
K_ecdh = ECDH(priv_ecdh_a, pub_ecdh_b)(Alice)K_ecdh = ECDH(priv_ecdh_b, pub_ecdh_a)(Bob)Alice décapsule ML-KEM :
K_mlkem_alice = ML-KEM.Decapsulate(priv_mlkem_a, ciphertext)Les deux dérivent le secret final :
secret = HKDF-SHA256(K_ecdh ‖ K_mlkem, salt="q-ready-hybrid-v1")Vérification :
secret_alice == secret_bob→True✅Implémentation Python recommandée :
Si
oqsn'est pas disponible, utiliserpqcryptoou une implémentation pure-Python de ML-KEM-768 (acceptable pour une démo pédagogique).Output attendu :