Color scheme: Dark
You are here: start » de » Dokumentation » Post-Quanten-Kryptografie » WKL.System.Security.Cryptography – Überblick » Anleitungen » So signieren und prüfen Sie Daten

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

ElementZweck
RSA.SignData, ECDsa.SignData mit CryptoMode.HybridComposite-ML-DSA-Signatur
RSA.VerifyData, ECDsa.VerifyData mit CryptoMode.Hybridprüft beide Anteile der Composite-Signatur
SignatureExtensions.SetTransientPqKeylegt das ML-DSA-Schlüsselpaar für den aktuellen Thread fest
SignatureExtensions.SetTransientPqPublicKeylegt den öffentlichen ML-DSA-Schlüssel für die Prüfung fest
SignatureExtensions.ClearTransientPqKeyentfernt die Schlüssel des Threads und überschreibt den privaten Schlüssel
MLDsaKey.SignData, MLDsaKey.VerifyDatareine 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 CryptographicException ab, die das Paar nennt. Die Liste steht unter Formate der Post-Quanten-Anteile.
  • Ein Schlüssel je Thread. Die Schlüssel aus SetTransientPqKey gelten nur für den Thread, der sie setzt. Setzen Sie sie in asynchronem Code unmittelbar vor dem Aufruf, ohne await dazwischen, und entfernen Sie sie im selben Thread wieder. Fehlt der Schlüssel, wirft SignData eine CryptographicException.
  • ClearTransientPqKey überschreibt Ihr Array. Die Bibliothek kopiert den privaten Schlüssel nicht. ClearTransientPqKey füllt das übergebene Array mit Nullen. Übergeben Sie deshalb eine Kopie, die Sie danach nicht mehr brauchen, wie im Beispiel das Ergebnis von ExportPkcs8PrivateKey.
  • .NET prüft die Composite-Signatur nicht. rsa.VerifyData ohne CryptoMode gibt für eine Composite-Signatur false zurü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