Farbschema: Dunkel
Sie befinden sich hier: start » de » Dokumentation » Post-Quanten-Kryptografie » WKL.System.Security.Cryptography – Überblick » Anleitungen » So signieren Sie XML-Dokumente

So signieren Sie XML-Dokumente

Sie signieren XML-Dokumente mit SignedXml von .NET, etwa elektronische Rechnungen, und wollen neben der RSA-Signatur eine ML-DSA-Signatur in dasselbe Signaturelement legen.

Lösungsübersicht

ElementZweck
SignedXml.ComputeSignature(pqKey, CryptoMode.Hybrid)signiert klassisch mit SigningKey und legt eine ML-DSA-Signatur über dasselbe SignedInfo daneben
SignedXml.CheckSignature(key, pqPublicKey, CryptoMode.Hybrid)prüft beide Signaturen
SignedXml.ComputeSignature(pqKey, CryptoMode.PostQuantum)signiert nur mit ML-DSA; braucht PostQuantumExemptions.PurePostQuantum

Für SignedXml binden Sie das Paket System.Security.Cryptography.Xml ein, wie bei .NET üblich.

Umsetzung

Signieren:

var document = new XmlDocument { PreserveWhitespace = true };
document.LoadXml("<Invoice><Number>2026-0042</Number><Amount currency=\"EUR\">1190.00</Amount></Invoice>");
 
using var xmlRsa = RSA.Create(3072);
using var xmlPq = MLDsaKey.Generate(MLDsaParameterSet.MLDsa65);
 
var signedXml = new SignedXml(document) { SigningKey = xmlRsa };
var reference = new Reference(string.Empty);
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
signedXml.AddReference(reference);
signedXml.ComputeSignature(xmlPq, CryptoMode.Hybrid);
document.DocumentElement!.AppendChild(document.ImportNode(signedXml.GetXml(), true));
string signedDocument = document.OuterXml;

Prüfen beim Empfänger, der den öffentlichen RSA- und den öffentlichen ML-DSA-Schlüssel kennt:

var received = new XmlDocument { PreserveWhitespace = true };
received.LoadXml(signedDocument);
var check = new SignedXml(received);
check.LoadXml((XmlElement)received.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl)[0]!);
 
Console.WriteLine(check.CheckSignature(xmlRsa, xmlPq, CryptoMode.Hybrid));

Hinweise

  • Klassische Prüfer. Die ML-DSA-Signatur liegt in einem ds:Object des Signaturelements. Die RSA-Signatur deckt nur SignedInfo ab, und die Transformation „enveloped signature“ nimmt das ganze Signaturelement aus den Referenzen heraus. CheckSignature(xmlRsa) von .NET bestätigt die Signatur deshalb wie gewohnt.
  • Rückgabe wie bei .NET. CheckSignature gibt false zurück, wenn eine Signatur nicht stimmt, auch wenn in der Betriebsart Hybrid die ML-DSA-Signatur fehlt. Eine CryptographicException folgt nur dort, wo auch .NET wirft, oder wenn sich der PQ-Anteil gar nicht prüfen lässt, etwa ohne OpenSSL.
  • Leerraum erhalten. Laden Sie Dokumente mit PreserveWhitespace = true. Ändert sich der Leerraum zwischen Signieren und Prüfen, stimmen beide Signaturen nicht mehr.
  • Vorläufige Kennungen. Element, Namensraum und die Algorithmus-URIs für ML-DSA sind vorläufig; siehe Formate der Post-Quanten-Anteile.

Verwandte Themen

de/wiki/pqcrypt/lib/how-to/sign-xml-documents.txt · Zuletzt geändert: von Wolfgang van der Stille