dru*_*rup 25 c# cryptography digital-signature public-key-encryption x509
我回顾了很多论坛和例子,但没有人帮助我.我需要从任何Web服务验证签名.我有带有公钥的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);
}
Run Code Online (Sandbox Code Playgroud)
但结果总是假的:(
我有一个OpenSSL示例:
openssl base64 -d -in signature -out signature.bin
openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway
Run Code Online (Sandbox Code Playgroud)
我怀疑使用 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);
Run Code Online (Sandbox Code Playgroud)
输出
ASCIIEncoding bytes length: 5
UnicodeEncoding bytes length: 10
Run Code Online (Sandbox Code Playgroud)