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
| Element | Zweck |
|---|---|
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:Objectdes Signaturelements. Die RSA-Signatur deckt nurSignedInfoab, 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.
CheckSignaturegibtfalsezurück, wenn eine Signatur nicht stimmt, auch wenn in der BetriebsartHybriddie ML-DSA-Signatur fehlt. EineCryptographicExceptionfolgt 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 · Last modified: by Wolfgang van der Stille