C# 使用RSACryptoServiceProvider最小化签名段中的信息

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

我有一个XML文件,看起来像这样

<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
元素。有几个原因:

  • 它是XML签名模式所必需的。如果删除它,支持XML签名的软件将崩溃
  • SignatureValue
    通过
    SignedInfo
    计算。如果
    SignedInfo
    不存在,则无需验证

  • 在许可证文件中,消息验证器可能知道摘要算法和其他参数,尽管有些“带外”的意思,我想您可能会认为验证器可以重建
    SignerInfo
    结构。但是,似乎很难证明违反标准并进行所需的额外工作是合理的。

    不,您不能删除
    SignedInfo
    元素。有几个原因:

  • 它是XML签名模式所必需的。如果删除它,支持XML签名的软件将崩溃
  • 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);