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

时间:2009-04-17 19:39:20

标签: c# .net xml cryptography

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

<Licence>
      <Name>Test company</Name>
      <Version>1.1.1.1</Version>
      <NumberOfServer>2</NumberOfServer>
</Licence>

然后,我使用先前生成的私钥使用以下代码

对XML文件进行签名
private void SignFile(XmlDocument doc)
{
    SignedXml signedXml = new SignedXml(doc2);

    _cryptoServiceProvider.FromXmlString(XmlDocument.Load("private.key").Root.ToString());

    signedXml.SigningKey = _cryptoServiceProvider;

    Signature XMLSignature = signedXml.Signature;

    Reference reference = new Reference("");

    XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
    reference.AddTransform(env);

    XMLSignature.SignedInfo.AddReference(reference);

    signedXml.ComputeSignature();

    XmlElement xmlDigitalSignature = signedXml.GetXml();

    doc.DocumentElement.AppendChild(doc2.ImportNode(xmlDigitalSignature, true));

    doc.Save("signed.xml");
}

我得到一个看起来像这样的文件,用公钥验证!

<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字段,我该如何摆脱它?

我使用这样的东西来验证。

    _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);

1 个答案:

答案 0 :(得分:1)

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

  1. XML签名架构需要它。如果删除它,支持XML签名的软件将会中断。
  2. SignatureValue的计算结果为SignedInfo。如果缺少SignedInfo,则无需验证。
  3. 在许可证文件中,消息验证者可能知道摘要算法和其他参数,虽然有些“带外”意味着,但我认为您可以认为验证者可以重建SignerInfo结构。但是,似乎很难证明打破标准并完成所需的额外工作是合理的。