【问题标题】:How to Verify Signature, Loading PUBLIC KEY From CRT file?如何验证签名,从 CRT 文件加载公钥?
【发布时间】:2012-06-28 15:06:21
【问题描述】:

我查看了许多论坛和示例,但没有一个对我有帮助。我需要验证任何网络服务的签名。我有用于验证的带有公钥的 test.crt 文件。

static bool Verify(string text, string signature)
{
  X509Certificate2 cert = new X509Certificate2(
      HttpContext.Current.Server.MapPath("test-server.cert"));
  RSACryptoServiceProvider csp = (RSACryptoServiceProvider) cert.PublicKey.Key;

  // Hash the data
  SHA1Managed sha1 = new SHA1Managed();
  UnicodeEncoding encoding = new UnicodeEncoding();
  byte[] data = encoding.GetBytes(text);
  byte[] sign = Convert.FromBase64String(signature);
  byte[] hash = sha1.ComputeHash(data);

  return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sign);
}

但结果总是错误的:(

我有一个 OpenSSL 示例:

openssl base64 -d -in signature -out signature.bin
openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway

【问题讨论】:

  • 我创建了一个简单的应用程序,它为文本生成签名并立即验证它。你可以在这里查看:dl.dropbox.com/u/1171045/11221877/Program.cs
  • 所以上面的方法还是可以的。您确定使用正确的证书进行签名和验证吗?
  • 我对网络应用做了同样的事情,所以它不是网络的东西。您如何将签名从 Web 服务传递到您的应用程序?
  • @drup 你确定签名是正确的吗?因为在这里你说你不能得到签名:stackoverflow.com/questions/11184890/can-not-get-signature
  • 我没有发现代码有任何问题,因此请检查您的输入。例如。我可以看到您似乎在 C# 代码中使用了 openssl 的二进制签名和 base64 编码的签名。任何错误的字符编码也可以解决问题,可能 openssl 假定为 ASCII,您似乎假定为 16 位 Unicode(让 Microsoft 将编码称为“Unicode”,有时他们可能是这样的白痴)。

标签: c# cryptography digital-signature public-key-encryption x509


【解决方案1】:

我怀疑使用 UnicodeEncoding 可能是失败的原因。如下所示,ASCIIEncoding 和 UnicodeEncoding 的字节不相同,因为 ASCII 是 8 位编码,而在 Windows 中,Unicode 编码是 16 位宽。在您的另一个问题Can not get signature 中,您使用了 ASCIIEncoding。所以假设签名是根据文本/字符串的 ASCIIEncoding 字节计算的,并且使用 UnicodeEncoding 进行验证显然不会匹配。

string text = "Hello";
Console.WriteLine("ASCIIEncoding bytes length: {0}", new ASCIIEncoding().GetBytes(text).Length);
Console.WriteLine("UnicodeEncoding bytes length: {0}", new UnicodeEncoding().GetBytes(text).Length);

输出

ASCIIEncoding bytes length: 5
UnicodeEncoding bytes length: 10

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2013-08-17
    • 2013-05-28
    • 1970-01-01
    • 2019-07-24
    • 2017-02-18
    • 2023-04-06
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多