Color scheme: Dark
You are here: start » de » Dokumentation » Post-Quanten-Kryptografie » WKL.System.Security.Cryptography – Überblick » Anleitungen » So signieren Sie CMS-Nachrichten

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

ElementZweck
SignedDataExtensions.CreatePqAwareSignererzeugt einen CmsSigner für ein hybrides Zertifikat und prüft, dass sein ML-DSA-Schlüssel vorhanden ist
SignedCms.ComputeSignature mit CryptoMode.Hybridsigniert klassisch, kündigt die PQ-Signatur in einem signierten Attribut an und fügt sie an
SignedCms.CheckSignature mit CryptoMode.Hybridprü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 CheckSignature von .NET wie jede andere.
  • Herabstufung wird erkannt. Ein nicht signiertes Attribut kann jeder entfernen. Weil die klassische Signatur die Ankündigung schützt, erkennt CheckSignature mit CryptoMode.Hybrid eine entfernte PQ-Signatur und wirft eine CryptographicException. Ebenso weist es eine PQ-Signatur ab, die mit einem anderen als dem angekündigten Schlüssel erstellt wurde.
  • Kein spontaner Schlüssel. CreatePqAwareSigner erzeugt nie einen ML-DSA-Schlüssel. Fehlt der Schlüssel des Zertifikats im Prozess, wirft die Methode sofort eine CryptographicException. 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: true prüft nur die Signaturen. Mit false prüft .NET zusätzlich die Kette des Unterzeichnerzertifikats nach den Regeln des Betriebssystems, ohne PQ-Anteil. Den PQ-Anteil der Kette prüfen Sie mit X509Chain.Build und CryptoMode.Hybrid.

Verwandte Themen

de/wiki/pqcrypt/lib/how-to/sign-cms-messages.txt · Last modified: by Wolfgang van der Stille