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
| Element | Zweck |
|---|---|
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.Encapsulate | Absender: leitet den Schlüssel ab und liefert, was der Empfänger dazu braucht |
HybridKeyAgreement.Decapsulate | Empfänger: leitet denselben Schlüssel ab |
HybridEncapsulation | Ergebnis 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,keyLengthundcombinermü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
EncapsulateeineCryptographicException, solangePostQuantumExemptions.ReducedParameterSetsfehlt. - 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 EreignisPolicyDeviation. Der Absender brauchtPostQuantumExemptions.NonRecommendedCombiners. - Eigene Protokolle mit anderen Verfahren. Für eine andere Paarung als ECDH und ML-KEM kombiniert
KeyCombiner.Combinezwei Geheimnisse mit ihren Chiffraten und öffentlichen Schlüsseln nach KeyCombine.