Podpisovanje dokumentov XML
Dokumente XML, na primer elektronske račune, podpisujete s SignedXml iz .NET in želite poleg podpisa RSA v
isti element podpisa dodati še podpis ML-DSA.
Pregled rešitve
| Element | Namen |
|---|---|
SignedXml.ComputeSignature(pqKey, CryptoMode.Hybrid) | podpiše klasično s SigningKey in poleg doda podpis ML-DSA prek istega SignedInfo |
SignedXml.CheckSignature(key, pqPublicKey, CryptoMode.Hybrid) | preveri oba podpisa |
SignedXml.ComputeSignature(pqKey, CryptoMode.PostQuantum) | podpiše samo z ML-DSA; potrebuje PostQuantumExemptions.PurePostQuantum |
Za SignedXml vključite paket System.Security.Cryptography.Xml, kot je v .NET običajno.
Izvedba
Podpisovanje:
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;
Preverjanje pri prejemniku, ki pozna javni ključ RSA in javni ključ ML-DSA:
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));
Opombe
- Klasični preverjevalniki. Podpis ML-DSA je v elementu
ds:Objectznotraj elementa podpisa. Podpis RSA pokriva samoSignedInfo, transformacija »enveloped signature« pa celoten element podpisa izvzame iz referenc.CheckSignature(xmlRsa)iz .NET zato podpis potrdi kot običajno. - Vrnjena vrednost kot v .NET.
CheckSignaturevrnefalse, kadar podpis ni pravilen, tudi kadar v načinuHybridpodpis ML-DSA manjka.CryptographicExceptionsledi samo tam, kjer izjemo sproži tudi .NET, ali kadar dela PQ sploh ni mogoče preveriti, na primer brez OpenSSL. - Ohranite presledke. Dokumente nalagajte s
PreserveWhitespace = true. Če se presledki med podpisovanjem in preverjanjem spremenijo, nobeden od podpisov ni več pravilen. - Začasni identifikatorji. Element, imenski prostor in URI-ji postopkov za ML-DSA so začasni; glejte Oblike postkvantnih delov.
Sorodne teme
sl/wiki/pqcrypt/lib/how-to/sign-xml-documents.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille