【问题标题】:How to Verify Signature, Loading PUBLIC KEY From PEM file?如何验证签名,从 PEM 文件加载公钥?
【发布时间】:2010-11-06 17:24:12
【问题描述】:

我发布这篇文章是希望它可以帮助其他人节省我在这个涉及转换公钥格式的非常愚蠢的问题上所浪费的时间。如果有人看到更简单的解决方案或问题,请告诉我!

我使用的电子商务系统会向我发送一些数据和签名。他们还以 .pem 格式给我他们的公钥。 .pem 文件如下所示:

-----开始公钥----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDe+hkicNP7ROHUssGNtHwiT2Ew HFrSk/qwrcq8v5metRtTTFPE/nmzSkRnTs3GMpi57rBdxBBJW5W9cpNyGUh0jNXc VrOSClpD5Ri2hER/GcNrxVRP7RlWOqB1C03q4QYmwjHZ+zlM4OUhCCAtSWflB4wC Ka1g88CjFwRw/PB9kwIDAQAB -----结束公钥-----

这是将上述内容转换为能够验证签名的“RSACryptoServiceProvider”的神奇代码。使用 BouncyCastle 库,因为 .NET 显然(如果没有涉及证书文件的一些主要问题,就无法做到这一点):

RSACryptoServiceProvider thingee;

using (var reader = File.OpenText(@"c:\pemfile.pem"))
{
    var x = new PemReader(reader);
    var y = (RsaKeyParameters)x.ReadObject();

    thingee = (RSACryptoServiceProvider)RSACryptoServiceProvider.Create();
    var pa = new RSAParameters();
    pa.Modulus = y.Modulus.ToByteArray();
    pa.Exponent = y.Exponent.ToByteArray();
    thingee.ImportParameters(pa);
}

然后是实际验证签名的代码:

var signature = ... //reads from the packet sent by the eCommerce system
var data = ... //reads from the packet sent by the eCommerce system
var sha = new SHA1CryptoServiceProvider();
byte[] hash = sha.ComputeHash(Encoding.ASCII.GetBytes(data));
byte[] bSignature = Convert.FromBase64String(signature);

///Verify signature, FINALLY:
var hasValidSig = thingee.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), bSignature);

【问题讨论】:

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


    【解决方案1】:

    潜在问题:使用Encoding.ASCII.GetBytes(data) 几乎肯定是获取哈希的错误方法。这意味着他们只能发送一个没有设置任何高位的哈希。

    如果这是在“数据包”中,您应该从数据包中获取原始数据作为字节数组。如果它表示为文本,它应该是某种编码形式 - 例如十六进制或base64。哈希是什么样的?

    【讨论】:

    • 嗯......你可能是对的 - 我认为它可能是 Base 64 编码的。为此干杯!不幸的是,在银行将我们的系统投入生产之前,我无法进行实时测试,所以现在我只是验证它为我的假签名返回 FALSE。在一周内,我应该能够测试 TRUE 签名案例,如果它不起作用,我会发布跟进。真的浪费了四个小时试图弄清楚这一点......
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 2013-08-17
    • 2013-05-28
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2017-04-09
    • 2017-02-18
    相关资源
    最近更新 更多