signedXml.CheckSignature始终返回false

时间:2009-01-10 05:15:29

标签: c# cryptography encryption

我正在努力让这个加密解密工作正常。 我使用的是Wolfwyrd提供的this课程和this说明。

以下是代码:

RSACryptoServiceProvider rsaKey = EncryptionUtils.GetRSAFromSnkFile(@"c\:a.snk");

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = true;
xmlDoc.LoadXml("<foo />");

SignXml(xmlDoc, rsaKey); //http://msdn.microsoft.com/en-us/library/ms229745.aspx

bool result = VerifyXml(xmlDoc, rsaKey); //http://msdn.microsoft.com/en-us/library/ms229950.aspx

System.Diagnostics.Debug.Write(result); //false

返回false。注意,我使用了相同的snk文件,并且我尝试验证的是相同的加密xml文档,为什么它会返回false?我错过了什么?

3 个答案:

答案 0 :(得分:2)

谢谢你们的回复。我最终只创建了一个私钥/公钥对,并使用它来签署文档,公钥随应用程序一起发送。如果我早点看到这个,我可能会用它,但我相信其他人会发现它很有用。再次感谢。

答案 1 :(得分:1)

尝试将Wolfwyrd代码中的GetRSAFromSnkBytes(byte [])的实现更改为:

private static RSACryptoServiceProvider GetRSAFromSnkBytes(byte[] snkBytes)
{
  if (snkBytes == null)
    throw new ArgumentNullException("snkBytes");

  RSAParameters param = GetRSAParameters(snkBytes);

  RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  rsa.ImportParameters(param);
  return rsa;
}

我真的不明白他为什么先生成一个密钥,然后将snk-key导入容器,而不是刚开始使用空密钥容器。

您也可以考虑使用.NET生成密钥,而不是使用snk格式。

如果您将示例中的第一行更改为

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(1024);

您的代码也可以正常工作(您可以自己序列化生成的密钥)。

答案 2 :(得分:1)

很好的地方,我从项目中抽出来了。图书馆已更新。