Skip to content

D1 - Script démo hybride standalone #34

@Rowuni

Description

@Rowuni

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

  1. 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
  2. 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
  3. 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
  4. Alice décapsule ML-KEM :

    • K_mlkem_alice = ML-KEM.Decapsulate(priv_mlkem_a, ciphertext)
  5. Les deux dérivent le secret final :

    • secret = HKDF-SHA256(K_ecdh ‖ K_mlkem, salt="q-ready-hybrid-v1")
  6. Vérification : secret_alice == secret_bobTrue

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

Metadata

Metadata

Assignees

Labels

Démo hybrideRecherchePour ce qui nécéssite principalement de la recherchefeatureImprovements or additions to documentation

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions