Retour

PQC Hybrid: RSA & Kyber

Documentation & Explications du projet de cryptographie post-quantique hybride

Présentation du projet

Ce projet met en œuvre un protocole d'échange de clés hybride combinant RSA (cryptographie classique) et Kyber (cryptographie post-quantique) pour sécuriser les communications entre deux parties, Alice et Bob.

Enjeux de la cryptographie post-quantique

  • Ordinateurs quantiques « casseurs » de RSA/ECC : un horizon lointain (≥ 2040–2050)
    Les experts estiment qu’un ordinateur quantique universel capable de briser RSA/ECC ne sera pas réalisable avant des décennies. Un rapport de l’Académie nationale des sciences américaine (NASEM, 2019) indique que même en accélérant la transition cryptographique dès maintenant, le premier ordinateur quantique capable de casser RSA-2048 n’apparaîtrait pas avant ~2040. D’autres analyses repoussent l’échéance vers 2040–2050 du fait des défis d’ingénierie des qubits (stabilité, correction d’erreurs) (ciaonet.org). En pratique, il faudrait des milliers de qubits logiques corrigés d’erreurs pour exécuter Shor à grande échelle (par ex. ≈2500 qubits logiques pour RSA-2048, NASEM), très au-delà des capacités des machines actuelles (qui n’ont que quelques centaines de qubits physiques bruités). Ces contraintes matérielles rendent improbable une rupture quantique avant plusieurs décennies.
  • L’algorithme de Shor, une menace théorique conditionnée à un grand ordinateur quantique
    L’algorithme de Shor permet en théorie de factoriser RSA ou de résoudre le log discret (ECC) en temps polynomial, mais seulement s’il tourne sur un ordinateur quantique universel à grande échelle. En d’autres termes, Shor n’est dangereux pour RSA/ECC que si l’on dispose d’un calculateur quantique tolérant aux fautes suffisamment puissant. Comme le soulignent les agences de cybersécurité, « cette menace pour la cryptographie provient du développement d’un ordinateur quantique tolérant aux pannes de grande taille, capable de casser les schémas à clé publique traditionnels (RSA, ECC) grâce à l’algorithme de Shor » (bsi.bund.de). À ce jour, aucun ordinateur quantique « cryptographiquement pertinent » n’existe (bsi.bund.de) – les dispositifs quantiques actuels sont trop limités – de sorte que RSA/ECC demeurent pour l’instant sûrs. L’algorithme de Shor constitue donc une menace potentielle à moyen/long terme, tributaire des progrès en informatique quantique.
  • Le risque du « store now, decrypt later » justifie une transition proactive
    Malgré l’absence actuelle de calculateur quantique capable de casser nos chiffrements, les données sensibles échangées aujourd’hui sont menacées par la stratégie dite « store now, decrypt later ». Ce scénario, reconnu par les autorités, consiste pour un adversaire à capturer et stocker dès maintenant des communications chiffrées, dans l’attente de disposer un jour d’un ordinateur quantique pour les déchiffrer ultérieurement (bsi.bund.de). Cette perspective est jugée crédible pour les informations devant rester confidentielles longtemps (données personnelles sensibles, secrets industriels, communications gouvernementales, etc.). Un document conjoint du BSI (Allemagne) et d’autres agences (2024) classe « store-now/decrypt-later » parmi les deux menaces quantiques majeures, et en déduit qu’il faut anticiper dès à présent la migration vers des systèmes post-quantiques (bsi.bund.de). En clair, pour protéger les données d’aujourd’hui contre une décryption future, il est prudent d’adopter sans tarder des algorithmes résistants aux attaques quantiques.
  • Des bases mathématiques différentes pour la cryptographie post-quantique, implémentable classiquement
    La cryptographie post-quantique (PQC) regroupe des algorithmes cryptographiques (typiquement de nouvelles méthodes à clé publique) fondés sur des problèmes mathématiques réputés résistants aux ordinateurs quantiques. Ces problèmes ne sont pas ceux du RSA/Log discret : ils appartiennent à d’autres familles mathématiques (par ex. problèmes de réseaux euclidiens – lattices, codes correcteurs d’erreurs, fonctions de hachage, systèmes multivariés, isogénies de courbes, etc.) (enisa.europa.eu). Le point crucial est que, contrairement à la « quantum cryptographie » (ex : QKD) nécessitant des dispositifs quantiques, les algorithmes post-quantiques s’exécutent sur du matériel classique. Ce sont des logiciels/ circuits conventionnels – intégrables dans nos ordinateurs et réseaux actuels – mais conçus pour résister aux futurs calculateurs quantiques. Comme l’explique le NIST, on développe « de nouveaux standards de chiffrement qui fonctionneront sur nos ordinateurs classiques actuels tout en résistant aux machines quantiques du futur » (nist.gov). Autrement dit, les algorithmes post-quantiques sont déployables sur les ordinateurs et processeurs d’aujourd’hui, ce qui facilite leur adoption progressive. Plusieurs grandes familles de solutions PQC (basées sur réseaux, codes, hachage, etc.) ont d’ores et déjà fait l’objet d’implémentations et d’une évaluation cryptanalytique approfondie dans le cadre du processus de standardisation internationale.
  • Standardisation NIST : Kyber, Dilithium et autres algorithmes post-quantiques robustes
    Consciente de ces enjeux, l’agence NIST (États-Unis) a lancé dès 2016 un processus de standardisation de la cryptographie post-quantique. Après plusieurs tours d’évaluation ouverts à la communauté scientifique, le NIST a annoncé en 2022 la sélection d’un premier ensemble de quatre algorithmes PQ robustes qui serviront de nouveaux standards (cyber.gouv.fr). Parmi eux figurent CRYSTALS-Kyber (schéma d’établissement de clé à base de réseaux euclidiens) et CRYSTALS-Dilithium (schéma de signature numérique à base de réseaux) – deux propositions conjuguant sécurité conjecturale quantique et bonnes performances. Les deux autres lauréats initiaux sont FALCON (signature sur réseaux) et SPHINCS+ (signature basée sur les fonctions de hachage) (cyber.gouv.fr). En 2023–2024, le NIST a publié les premiers projets de normes (FIPS 203, 204, 205) consacrés à ces algorithmes et prévoit d’en standardiser d’autres d’ici peu (nist.gov, bsi.bund.de). Des organismes internationaux et gouvernements appuient cette transition – par ex. l’ANSSI en France encourage dès maintenant l’hybridation et l’expérimentation de solutions post-quantiques, surtout pour les produits devant protéger des données au-delà de 2030 (cyber.gouv.fr). En résumé, la migration vers des algorithmes post-quantiques est en cours : elle s’appuie sur de nouveaux fondements mathématiques éprouvés académiquement, implémentables sur nos infrastructures actuelles, et en voie de normalisation par des institutions comme le NIST.
  • Fonctionnement général du protocole

    1. Génération des paires de clés RSA et Kyber pour Alice et Bob
    2. Échange des clés publiques
    3. Encapsulation de secrets avec RSA et Kyber (dans les deux sens)
    4. Dérivation d'une clé finale commune avec HKDF
    5. Chiffrement/déchiffrement des messages avec AES-GCM

    [À compléter : Décrivez chaque étape, les fichiers échangés, la synchronisation, etc.]

    Détail des fonctions principales

    Génération et export des clés

    La sécurité du protocole repose sur la génération de paires de clés robustes pour chaque participant (Alice et Bob), à la fois pour l'algorithme classique RSA et pour l'algorithme post-quantique Kyber.

    RSA

    
    # Génération d'une paire de clés RSA pour Bob
    from cryptography.hazmat.primitives.asymmetric import rsa
    from cryptography.hazmat.primitives import serialization
    
    rsa_private = rsa.generate_private_key(public_exponent=65537, key_size=2048)
    # Sauvegarde de la clé privée
    with open("bob_rsa_private.pem", "wb") as f:
        f.write(rsa_private.private_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PrivateFormat.PKCS8,
            encryption_algorithm=serialization.NoEncryption()
        ))
    # Export de la clé publique dans le dossier d'Alice
    with open(r"C:\Users\zoran\Documents\Projet_Crypto\Alice\bob_rsa_public.pem", "wb") as f:
        f.write(rsa_private.public_key().public_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PublicFormat.SubjectPublicKeyInfo
        ))
                

    Kyber (version pédagogique simplifiée)

    
    # Génération d'une paire de clés Kyber pour Bob
    import simple_kyber512
    
    pk, sk = simple_kyber512.keygen()
    # Sauvegarde des clés
    with open("bob_kyber_pk.bin", "wb") as f:
        f.write(pk)
    with open("bob_kyber_sk.bin", "wb") as f:
        f.write(sk)
    # Export de la clé publique dans le dossier d'Alice
    import os
    alice_dir = r"C:\Users\zoran\Documents\Projet_Crypto\Alice"
    os.makedirs(alice_dir, exist_ok=True)
    with open(os.path.join(alice_dir, "bob_kyber_pk.bin"), "wb") as f:
        f.write(pk)
                

    Résumé : Chaque participant dispose ainsi de ses propres clés privées (RSA et Kyber) et exporte ses clés publiques dans le dossier de l'autre, permettant à chacun de chiffrer des secrets à destination de l'autre.

    Encapsulation et décapsulation

    L'encapsulation permet à une partie (ex : Bob) de générer un secret partagé, de le chiffrer avec la clé publique de l'autre (ex : Alice), puis de lui transmettre ce secret chiffré. La décapsulation permet à Alice de retrouver ce secret à l'aide de sa clé privée. Ce mécanisme est réalisé à la fois pour RSA (classique) et Kyber (post-quantique).

    RSA

    
    # Encapsulation RSA (Bob)
    from cryptography.hazmat.primitives.asymmetric import padding
    from cryptography.hazmat.primitives import hashes
    import os
    
    K_RSA_to_alice = os.urandom(32)  # Génère un secret aléatoire
    C_RSA_to_alice = alice_rsa_public.encrypt(
        K_RSA_to_alice,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    # Bob envoie C_RSA_to_alice à Alice
    
    # Décapsulation RSA (Alice)
    K_RSA_from_bob = alice_rsa_private.decrypt(
        C_RSA_to_alice,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    # Alice retrouve le même secret K_RSA_to_alice
                

    Avantage : RSA est bien connu et robuste contre les attaques classiques, mais vulnérable à un attaquant quantique. D'où l'intérêt de l'associer à Kyber.

    Kyber (version pédagogique simplifiée)

    
    # Encapsulation Kyber (Bob)
    import simple_kyber512
    
    C_Kyber_to_alice, K_Kyber_to_alice = simple_kyber512.encapsulate(alice_kyber_pk)
    # Bob envoie C_Kyber_to_alice à Alice
    
    # Décapsulation Kyber (Alice)
    K_Kyber_from_bob = simple_kyber512.decapsulate(C_Kyber_to_alice, alice_kyber_sk)
    # Alice retrouve le même secret K_Kyber_to_alice
                

    Avantage : Kyber repose sur des problèmes difficiles même pour un ordinateur quantique (lattices), ce qui garantit la sécurité post-quantique du protocole.

    Résumé : Les deux encapsulations sont réalisées dans les deux sens (Alice→Bob et Bob→Alice), puis les secrets obtenus sont combinés via HKDF pour obtenir une clé finale commune.

    Dérivation de la clé finale

    Après l'encapsulation et la décapsulation des secrets RSA et Kyber dans les deux sens (Alice→Bob et Bob→Alice), chaque partie possède quatre secrets :

    Pour obtenir une clé de session commune, ces quatre secrets sont concaténés dans le même ordre par Alice et Bob, puis passés à une fonction de dérivation de clé (HKDF avec SHA-256). Cela garantit que la clé finale (K_final) est identique pour les deux parties, tout en étant robuste contre les attaques classiques et quantiques.

    
    # Dérivation de la clé finale commune avec HKDF (extrait des scripts Alice/Bob)
    from cryptography.hazmat.primitives.kdf.hkdf import HKDF
    from cryptography.hazmat.primitives import hashes
    
    KDF = HKDF(
        algorithm=hashes.SHA256(),
        length=32,
        salt=None,
        info=b"KEM_RSA+Kyber",
    )
    K_final = KDF.derive(
        K_RSA_to_alice + K_Kyber_to_alice + K_RSA_to_bob + K_Kyber_to_bob
    )
    # K_final est la clé symétrique commune utilisée pour AES-GCM
                

    Points importants :

    Utilisation : Cette clé K_final sert ensuite à chiffrer/déchiffrer les messages échangés entre Alice et Bob via AES-GCM, assurant la confidentialité et l'intégrité des communications.

    Chiffrement symétrique

    Une fois la clé finale K_final dérivée, Alice et Bob peuvent échanger des messages chiffrés en toute sécurité. Le chiffrement symétrique utilisé ici est AES-GCM (Galois/Counter Mode), qui offre à la fois la confidentialité et l'intégrité des messages.

    
    # Chiffrement d'un message (extrait des interfaces Alice/Bob)
    from cryptography.hazmat.primitives.ciphers.aead import AESGCM
    import os
    
    aesgcm = AESGCM(K_final)
    nonce = os.urandom(12)
    ciphertext = aesgcm.encrypt(nonce, b"Message secret", None)
    # Envoi : écrire nonce + ciphertext dans un fichier partagé
    
    # Déchiffrement d'un message reçu
    aesgcm = AESGCM(K_final)
    # Lire nonce (12 octets) et ciphertext depuis le fichier
    plaintext = aesgcm.decrypt(nonce, ciphertext, None)
    # plaintext contient le message original
                

    Avantages d'AES-GCM :

    Dans le projet : Les messages sont échangés via des fichiers (ex : message_aesgcm_from_alice.bin), chaque fichier contenant d'abord le nonce puis le ciphertext. Les interfaces graphiques Alice/Bob automatisent ce processus pour l'utilisateur.

    Rapport d'étude : Échange de Clé Hybride RSA + Kyber (KEM)

    Introduction

    Ce rapport détaille mathématiquement et numériquement le protocole d'échange de clé hybride RSA + Kyber, avec exemples chiffrés, calculs étape par étape, et explications pédagogiques. Les deux parties (Alice et Bob) peuvent initier la procédure, qui est totalement symétrique.

    Remarque sur l'encapsulation

    Dans ce protocole hybride, l'encapsulation KEM est réalisée à la fois avec Kyber et avec RSA. Cela signifie que, tout comme pour Kyber, une clé symétrique aléatoire est générée puis encapsulée (chiffrée) à l'aide de la clé publique RSA du destinataire. Cette encapsulation RSA consiste à chiffrer la clé symétrique \( K_{RSA} \) avec la clé publique \((e, n)\) :

    $$ C_{RSA} = K_{RSA}^e \mod n $$

    Le destinataire décapsule (décrypte) la clé symétrique à l'aide de sa clé privée \( d \) :

    $$ K_{RSA} = C_{RSA}^d \mod n $$

    Ainsi, le protocole utilise deux KEM indépendants :

    Les deux clés symétriques issues de ces encapsulations sont ensuite fusionnées via la KDF pour obtenir la clé finale \( K_{\text{final}} \).

    Étape 1 — Génération des clés RSA (par Alice ou par Bob)

    Génération de clés RSA :

    Clés générées :

    Étape 2 — Encapsulation RSA (par Bob)

    Dans le protocole hybride, l'encapsulation KEM sur RSA consiste à générer une clé symétrique aléatoire \( K_{RSA} \) (par exemple, un entier ou une suite d'octets), puis à la chiffrer avec la clé publique RSA du destinataire.

    Étape 3 — Décapsulation RSA (par Alice)

    Étape 4 — Génération et encapsulation Kyber (exemple simplifié)

    Paramètres simplifiés :

    Génération de la clé publique d'Alice :

    Encapsulation par Bob :

    Décapsulation par Alice :

    Étape 5 — Fusion via KDF (HKDF-SHA256)

    Concaténation des clés pour la KDF :

    On concatène les clés dans l'ordre suivant (en notation hexadécimale) :

    $$ \text{Concat} = K_{RSA \rightarrow Alice} \| K_{Kyber \rightarrow Alice} \| K_{RSA \rightarrow Bob} \| K_{Kyber \rightarrow Bob} $$
    concat = (
        bytes.fromhex("73a14453b96e54a32fbc4a8d67870e62ba43a935a79bf269861179b2fc695028") +
        bytes.fromhex("2f0fd1e89b8de1d57292742ec380ea47066e307ad645f5bc3adad8a06ff58608") +
        bytes.fromhex("82de42be5d948f40870bc81fadf1959a8c28e140d88d00f7a2442c133b2cca34") +
        bytes.fromhex("fcb5f40df9be6bae66c1d77a6c15968866a9e6cbd7314ca432b019d17392f6f4")
    )
        

    Calcul de la KDF (HKDF-SHA256) :

    $$ K_{\text{final}} = \text{HKDF}_{\text{SHA256}}(\text{Concat}, \text{length}=32) $$

    Valeur obtenue dans la démo :

    K_final : b759b7c6a96735788d9c1426448cedf653063ca530dcce6f9f3eae04aa1392ea
        

    Étape 6 — Utilisation de la clé finale pour AES-GCM

    Supposons que l'on souhaite chiffrer le message "Bonjour Bob" avec un nonce d'exemple :

    from cryptography.hazmat.primitives.ciphers.aead import AESGCM
    
    key = bytes.fromhex("b759b7c6a96735788d9c1426448cedf653063ca530dcce6f9f3eae04aa1392ea")
    nonce = bytes.fromhex("00112233445566778899aabb")
    message = b"Bonjour Bob"
    
    aesgcm = AESGCM(key)
    ciphertext = aesgcm.encrypt(nonce, message, None)
    print(ciphertext.hex())
        

    Remarque : Le résultat du chiffrement dépendra du message, du nonce et de la clé.

    Résumé des étapes numériques

    1. Générer ou lire les clés \( K_{RSA \rightarrow Alice} \), \( K_{Kyber \rightarrow Alice} \), \( K_{RSA \rightarrow Bob} \), \( K_{Kyber \rightarrow Bob} \).
    2. Concaténer les clés dans l'ordre indiqué.
    3. Appliquer HKDF-SHA256 pour obtenir \( K_{\text{final}} \).
    4. Utiliser \( K_{\text{final}} \) comme clé AES-GCM pour chiffrer/déchiffrer les messages.

    Conclusion

    Ce protocole hybride RSA + Kyber permet un échange de clé sécurisé, résistant aux attaques classiques et quantiques. Il est totalement symétrique : Alice ou Bob peut initier l’échange. Tous les calculs sont reproductibles et vérifiables étape par étape.

    Annexe : Explication des fonctions du code

    Fonctions principales de KEM_RSA_Alice.py

    Fonctions principales de simple_kyber512.py (version pédagogique)

    Annexe : Explication détaillée du fonctionnement du code (scénario Alice ↔ Bob)

    Déroulement d'un échange complet

    1. Initialisation des clés :
      • Alice et Bob génèrent chacun une paire de clés RSA et une paire de clés Kyber (si elles n'existent pas déjà).
      • Les clés publiques sont exportées dans le dossier de l'autre partie pour permettre l'encapsulation.
    2. Encapsulation et échange de clés :
      • Chacun encapsule une clé symétrique pour l'autre avec RSA (clé publique de l'autre) et Kyber (clé publique de l'autre).
      • Les encapsulations (ciphertexts) et les clés symétriques générées sont sauvegardées dans des fichiers d'échange.
    3. Décapsulation et dérivation de la clé finale :
      • Chaque partie récupère les encapsulations reçues et utilise ses clés privées pour décapsuler les clés symétriques envoyées par l'autre.
      • Les 4 clés symétriques (2 envoyées, 2 reçues) sont concaténées et passées dans la KDF (HKDF-SHA256) pour obtenir la clé finale \( K_{\text{final}} \).
    4. Échange de messages chiffrés :
      • Alice et Bob peuvent maintenant s'envoyer des messages chiffrés avec AES-GCM en utilisant \( K_{\text{final}} \).
      • Les messages sont écrits dans des fichiers spécifiques (message_aesgcm_from_alice.bin, message_aesgcm_from_bob.bin).
      • À la réception, chaque partie lit le fichier, déchiffre le message, puis peut supprimer le fichier pour éviter les doublons ou pour des raisons de sécurité.
    5. Gestion des fichiers d'échange :
      • Avant chaque nouvel échange, le script vérifie la présence des fichiers d'échange existants.
      • Si des fichiers sont présents, l'utilisateur peut choisir de les supprimer pour repartir sur un échange propre (option proposée dans le script).
      • Cela évite les collisions ou l'utilisation de vieilles clés/messages.

    Résumé du flux de fichiers

    Sécurité et bonnes pratiques

    Résumé

    Le code permet un échange de clé hybride sécurisé, automatisé et reproductible, avec gestion complète des fichiers d'échange et possibilité de suppression pour garantir la fraîcheur et la sécurité des échanges.

    Pour aller plus loin

    Haut de page