Color scheme: Light
You are here: start » de » Dokumentation » Post-Quanten-Kryptografie » WKL.System.Security.Cryptography – Überblick » Anleitungen » So vereinbaren Sie einen hybriden Schlüssel

So vereinbaren Sie einen hybriden Schlüssel

Zwei Seiten Ihres eigenen Protokolls sollen einen gemeinsamen Schlüssel vereinbaren. Der Schlüssel soll sicher bleiben, solange ECDH oder ML-KEM sicher ist.

Lösungsübersicht

ElementZweck
ECDiffieHellman.Create(ECCurve.NamedCurves.nistP384)klassisches Schlüsselpaar des Empfängers, von .NET
MLKemKey.Generate(MLKemParameterSet.MLKem768)ML-KEM-Schlüsselpaar des Empfängers
HybridKeyAgreement.EncapsulateAbsender: leitet den Schlüssel ab und liefert, was der Empfänger dazu braucht
HybridKeyAgreement.DecapsulateEmpfänger: leitet denselben Schlüssel ab
HybridEncapsulationErgebnis des Absenders: SharedKey, EphemeralPublicKey, MLKemCiphertext

Beide Methoden kombinieren die Geheimnisse nach Voreinstellung mit KeyCombine nach NIST SP 800-227, wie es BSI TR-02102-1 empfiehlt; siehe Richtlinie für Post-Quanten-Verfahren.

Umsetzung

Der Empfänger erzeugt seine Schlüssel und gibt die öffentlichen Teile an den Absender:

using var recipientEcdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP384);
using var recipientKem = MLKemKey.Generate(MLKemParameterSet.MLKem768);
 
ECDiffieHellmanPublicKey ecdhPublic = recipientEcdh.PublicKey;
byte[] kemPublic = recipientKem.ExportEncapsulationKey();

Der Absender leitet den Schlüssel ab und schickt EphemeralPublicKey und MLKemCiphertext an den Empfänger:

byte[] info = Encoding.UTF8.GetBytes("example.com file transfer v1");
 
using var kemForSender = MLKemKey.ImportEncapsulationKey(MLKemParameterSet.MLKem768, kemPublic);
var sent = HybridKeyAgreement.Encapsulate(ecdhPublic, kemForSender, info);
 
byte[] message = SymmetricEncryptionExtensions.EncryptAesGcm(
    Encoding.UTF8.GetBytes("Hallo"), sent.SharedKey);

Der Empfänger leitet denselben Schlüssel ab und entschlüsselt:

byte[] key = HybridKeyAgreement.Decapsulate(
    recipientEcdh, recipientKem, sent.EphemeralPublicKey, sent.MLKemCiphertext, info);
 
Console.WriteLine(Encoding.UTF8.GetString(SymmetricEncryptionExtensions.DecryptAesGcm(message, key)));

Die Beispiele brauchen using System.Security.Cryptography;, using System.Text;, using WKL.System.Security.Cryptography;, using WKL.System.Security.Cryptography.KeyDerivation; und using WKL.System.Security.Cryptography.Encryption;.

Hinweise

  • Gleiche Werte auf beiden Seiten. info, keyLength und combiner müssen auf beiden Seiten gleich sein. Ein abweichender Wert führt nicht zu einer Ausnahme, sondern zu einem anderen Schlüssel. Die Entschlüsselung scheitert dann an der Prüfsumme von AES-GCM.
  • Veränderte Daten. Ein veränderter Chiffretext oder ein fremder Kurzzeitschlüssel ergeben ebenfalls einen anderen Schlüssel. Das ist gewollt: ML-KEM weist ungültige Chiffrate nicht mit einem Fehler ab, und das Protokoll darüber erkennt die Veränderung.
  • Parametersätze. ML-KEM-768 und ML-KEM-1024 sind ohne Freischaltung erlaubt. Mit ML-KEM-512 wirft Encapsulate eine CryptographicException, solange PostQuantumExemptions.ReducedParameterSets fehlt.
  • Gegenstellen mit einer früheren Fassung. Hat die Gegenstelle eine Fassung der Bibliothek mit dem ersten Kombinierer, übergeben Sie beiden Methoden combiner: HybridKeyCombiner.Version1. Der Empfänger braucht dafür keine Freischaltung und meldet das Ereignis PolicyDeviation. Der Absender braucht PostQuantumExemptions.NonRecommendedCombiners.
  • Eigene Protokolle mit anderen Verfahren. Für eine andere Paarung als ECDH und ML-KEM kombiniert KeyCombiner.Combine zwei Geheimnisse mit ihren Chiffraten und öffentlichen Schlüsseln nach KeyCombine.

Verwandte Themen

de/wiki/pqcrypt/lib/how-to/agree-hybrid-keys.txt · Last modified: by Wolfgang van der Stille