So signieren Sie CMS-Nachrichten
Sie signieren Nachrichten im Format CMS (PKCS#7), etwa für den Austausch von Dokumenten, und wollen neben der RSA- oder ECDSA-Signatur eine ML-DSA-Signatur mitgeben, ohne dass Empfänger ohne PQ-Kenntnis die Nachricht ablehnen.
Lösungsübersicht
| Element | Zweck |
|---|---|
SignedDataExtensions.CreatePqAwareSigner | erzeugt einen CmsSigner für ein hybrides Zertifikat und prüft, dass sein ML-DSA-Schlüssel vorhanden ist |
SignedCms.ComputeSignature mit CryptoMode.Hybrid | signiert klassisch, kündigt die PQ-Signatur in einem signierten Attribut an und fügt sie an |
SignedCms.CheckSignature mit CryptoMode.Hybrid | prüft die klassische Signatur wie .NET und danach die PQ-Signatur jedes Unterzeichners |
Umsetzung
Signieren; signerCertificate ist ein hybrides Zertifikat mit RSA-Schlüssel, dessen ML-DSA-Schlüssel im
Prozess vorhanden ist. Im Beispiel entsteht es selbst signiert:
using var signerRsa = RSA.Create(3072); using var signerCertificate = new CertificateRequest( "CN=Muster GmbH Buchhaltung", signerRsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1) .CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(1), CryptoMode.Hybrid); var content = new ContentInfo("Rechnung 2026-0042"u8.ToArray()); var outgoing = new SignedCms(content); outgoing.ComputeSignature(SignedDataExtensions.CreatePqAwareSigner(signerCertificate), CryptoMode.Hybrid); byte[] message = outgoing.Encode();
Prüfen beim Empfänger:
var incoming = new SignedCms(); incoming.Decode(message); incoming.CheckSignature(verifySignatureOnly: true, CryptoMode.Hybrid); Console.WriteLine("Beide Signaturen gültig.");
CheckSignature gibt nichts zurück und wirft bei einer ungültigen Signatur eine CryptographicException,
wie die Methode von .NET.
Hinweise
- Klassische Empfänger. Die PQ-Signatur steht in einem nicht signierten Attribut, ihre Ankündigung in einem signierten Attribut des SignerInfo. Empfänger ohne diese Bibliothek prüfen die Nachricht mit
CheckSignaturevon .NET wie jede andere. - Herabstufung wird erkannt. Ein nicht signiertes Attribut kann jeder entfernen. Weil die klassische Signatur die Ankündigung schützt, erkennt
CheckSignaturemitCryptoMode.Hybrideine entfernte PQ-Signatur und wirft eineCryptographicException. Ebenso weist es eine PQ-Signatur ab, die mit einem anderen als dem angekündigten Schlüssel erstellt wurde. - Kein spontaner Schlüssel.
CreatePqAwareSignererzeugt nie einen ML-DSA-Schlüssel. Fehlt der Schlüssel des Zertifikats im Prozess, wirft die Methode sofort eineCryptographicException. Laden Sie das Zertifikat dann aus einer PFX-Datei oder verwenden Sie die Überladung, die das Schlüsselpaar annimmt. - Vorläufige Kennungen. Die Attribute tragen vorläufige Kennungen; siehe Formate der Post-Quanten-Anteile.
- Zertifikatsprüfung.
verifySignatureOnly: trueprüft nur die Signaturen. Mitfalseprüft .NET zusätzlich die Kette des Unterzeichnerzertifikats nach den Regeln des Betriebssystems, ohne PQ-Anteil. Den PQ-Anteil der Kette prüfen Sie mitX509Chain.BuildundCryptoMode.Hybrid.
Verwandte Themen
de/wiki/pqcrypt/lib/how-to/sign-cms-messages.txt · Zuletzt geändert: von Wolfgang van der Stille