C# 使用RSACryptoServiceProvider最小化签名段中的信息
我有一个XML文件,看起来像这样C# 使用RSACryptoServiceProvider最小化签名段中的信息,c#,.net,xml,cryptography,C#,.net,Xml,Cryptography,我有一个XML文件,看起来像这样 <Licence> <Name>Test company</Name> <Version>1.1.1.1</Version> <NumberOfServer>2</NumberOfServer> </Licence> 我得到一个像这样的文件,并用公钥验证 <Licence> <Name>Test com
<Licence>
<Name>Test company</Name>
<Version>1.1.1.1</Version>
<NumberOfServer>2</NumberOfServer>
</Licence>
我得到一个像这样的文件,并用公钥验证
<Licence>
<Name>Test company</Name>
<Version>1.1.1.1</Version>
<NumberOfServer>2</NumberOfServer>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>tmGyr97mgGDviRpzcWjpMdNNMSI=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>Vc5R/OWiup4Rv7+1Tu8Ino83P0mh6npLkNYEaq0QVa6j+OvISOPERO57EllCQWdB1Lgjc7B+lmV4JiSvdfovkldhNZb4+iFgdrI+qOdSEIsBk/KhGS93PfekhDd3qirGerpeGbLAEqZ36jT0aT/QruZXpOX6Y6H5fqGj4prUZaM=</SignatureValue>
</Signature>
</Licence>
不,您不能删除
SignedInfo
元素。有几个原因:
SignatureValue
通过SignedInfo
计算。如果SignedInfo
不存在,则无需验证在许可证文件中,消息验证器可能知道摘要算法和其他参数,尽管有些“带外”的意思,我想您可能会认为验证器可以重建
SignerInfo
结构。但是,似乎很难证明违反标准并进行所需的额外工作是合理的。不,您不能删除SignedInfo
元素。有几个原因:
SignatureValue
通过SignedInfo
计算。如果SignedInfo
不存在,则无需验证在许可证文件中,消息验证器可能知道摘要算法和其他参数,尽管有些“带外”的意思,我想您可能会认为验证器可以重建
SignerInfo
结构。但是,似乎很难证明违反标准并进行所需的额外工作是合理的。好的。我有点这样想,但不知怎么的,我说服自己相信这是比较容易的。谢谢回答得好。我有点这样想,但不知怎么的,我说服自己相信这是比较容易的。谢谢回答得好。
<Licence>
<Name>Test company</Name>
<Version>1.1.1.1</Version>
<NumberOfServer>2</NumberOfServer>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>tmGyr97mgGDviRpzcWjpMdNNMSI=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>Vc5R/OWiup4Rv7+1Tu8Ino83P0mh6npLkNYEaq0QVa6j+OvISOPERO57EllCQWdB1Lgjc7B+lmV4JiSvdfovkldhNZb4+iFgdrI+qOdSEIsBk/KhGS93PfekhDd3qirGerpeGbLAEqZ36jT0aT/QruZXpOX6Y6H5fqGj4prUZaM=</SignatureValue>
</Signature>
</Licence>
_cryptoServiceProvider.FromXmlString(XDocument.Load("public.key").Root.ToString());
XmlDocument doc = new XmlDocument();
doc.Load("signed.xml");
SignedXml signedXml = new SignedXml(doc);
XmlNodeList nodeList = doc.GetElementsByTagName("Signature");
signedXml.LoadXml((XmlElement)nodeList[0]);
bool valid = signedXml.CheckSignature(_cryptoServiceProvider);