So signieren und prüfen Sie Daten
Sie signieren Bytefolgen, etwa Rechnungsdaten oder Nachrichten eines eigenen Protokolls, und prüfen die Signatur auf der Gegenseite – als Composite-ML-DSA-Signatur aus RSA oder ECDSA zusammen mit ML-DSA oder als reine ML-DSA-Signatur.
Lösungsübersicht
| Element | Zweck |
|---|---|
RSA.SignData, ECDsa.SignData mit CryptoMode.Hybrid | Composite-ML-DSA-Signatur |
RSA.VerifyData, ECDsa.VerifyData mit CryptoMode.Hybrid | prüft beide Anteile der Composite-Signatur |
SignatureExtensions.SetTransientPqKey | legt das ML-DSA-Schlüsselpaar für den aktuellen Thread fest |
SignatureExtensions.SetTransientPqPublicKey | legt den öffentlichen ML-DSA-Schlüssel für die Prüfung fest |
SignatureExtensions.ClearTransientPqKey | entfernt die Schlüssel des Threads und überschreibt den privaten Schlüssel |
MLDsaKey.SignData, MLDsaKey.VerifyData | reine ML-DSA-Signatur |
Umsetzung
Composite-Signatur mit RSA-3072 und ML-DSA-65:
byte[] data = "Rechnung 2026-0042"u8.ToArray(); using var rsa = RSA.Create(3072); using var pqKey = MLDsaKey.Generate(MLDsaParameterSet.MLDsa65); SignatureExtensions.SetTransientPqKey(pqKey.ExportSubjectPublicKeyInfo(), pqKey.ExportPkcs8PrivateKey()); byte[] signature; try { signature = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); } finally { SignatureExtensions.ClearTransientPqKey(); }
Prüfung auf der Gegenseite, die den öffentlichen RSA- und den öffentlichen ML-DSA-Schlüssel kennt:
SignatureExtensions.SetTransientPqPublicKey(pqKey.ExportSubjectPublicKeyInfo()); try { bool valid = rsa.VerifyData( data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1, CryptoMode.Hybrid); Console.WriteLine(valid); } finally { SignatureExtensions.ClearTransientPqKey(); }
Reine ML-DSA-Signatur:
byte[] pqSignature = pqKey.SignData(data); Console.WriteLine(pqKey.VerifyData(data, pqSignature));
Hinweise
- Nur die Paare des Entwurfs. Composite ML-DSA kennt feste Paare aus Parametersatz, klassischem Schlüssel und Hashverfahren, etwa ML-DSA-65 mit RSA-3072 oder RSA-4096 und ML-DSA-65 mit ECDSA P-256 oder P-384. Ein anderes Paar, etwa ML-DSA-65 mit RSA-2048, weist die Bibliothek mit einer
CryptographicExceptionab, die das Paar nennt. Die Liste steht unter Formate der Post-Quanten-Anteile. - Ein Schlüssel je Thread. Die Schlüssel aus
SetTransientPqKeygelten nur für den Thread, der sie setzt. Setzen Sie sie in asynchronem Code unmittelbar vor dem Aufruf, ohneawaitdazwischen, und entfernen Sie sie im selben Thread wieder. Fehlt der Schlüssel, wirftSignDataeineCryptographicException. ClearTransientPqKeyüberschreibt Ihr Array. Die Bibliothek kopiert den privaten Schlüssel nicht.ClearTransientPqKeyfüllt das übergebene Array mit Nullen. Übergeben Sie deshalb eine Kopie, die Sie danach nicht mehr brauchen, wie im Beispiel das Ergebnis vonExportPkcs8PrivateKey.- .NET prüft die Composite-Signatur nicht.
rsa.VerifyDataohneCryptoModegibt für eine Composite-Signaturfalsezurück, weil sie keine reine RSA-Signatur ist. Composite-Signaturen tauschen Sie deshalb nur mit Gegenstellen aus, die Composite ML-DSA prüfen. - Größe. Eine Composite-Signatur aus ML-DSA-65 und RSA-3072 ist 3693 Byte lang, eine reine ML-DSA-65-Signatur 3309 Byte. Planen Sie Datenbankfelder und Protokollrahmen entsprechend.
Verwandte Themen
de/wiki/pqcrypt/lib/how-to/sign-and-verify-data.txt · Last modified: by Wolfgang van der Stille