如何使用C#.NET在PEM文件中使用P-256密钥来计算ECDSA签名?

时间:2019-06-24 16:12:47

标签: .net cryptography digital-signature ecdsa cng

我是密码学的新手,我想使用C#.NET在Windows上对密码进行整理

我使用以下命令生成了椭圆曲线P-256(也称为secp256r1和prime256v1)密钥:

openssl ecparam –name prime256v1 -genkey –noout –out private.key

我使用以下命令生成了证书签名请求:

openssl req –new –key private.key –out certreq.csr –sha256

另一个小组给我发送了base-64编码的证书作为响应。到目前为止一切顺利。

我现在已经收到一些使用私钥计算ECDSA签名所需的“测试”数据。私钥类似于:

-----BEGIN EC PRIVATE KEY-----
FunnyHow?LIKEACLOWN?DOIAMUSEYOU?DOIMAKEYOULAUGH?==
-----END EC PRIVATE KEY-----

到目前为止,我一直在努力类似于以下代码:

byte[] cngBlob; // This was calculated based on another StackOverFlow post
byte[] testData       = "JoePesciWasGreatInGoodfellas";
CngKey cngKey         = CngKey.Import(cngBlob, CngKeyBlobFormat.EccPrivateBlob);
ECDsaCng eCDsaCng     = new ECDsaCng(cngKey);
byte[] signatureECDSA = eCDsaCng.SignData(testData);

我尝试根据Microsoft CNG | How to import PEM encoded ECDSA private key into MS Key Storage Provider使用私钥文件计算byte[] cngBlob 但是在byte[] signatureECDSA中却没有得到正确的答案。

如何从文件中读取私钥,然后将其用于计算测试数据的ECDSA签名?

我已经开始深入研究迷人的密码学世界,但是要花些时间才能熟悉它。我在正确的轨道上吗?在此期间,任何有助于我解决此问题的技巧将不胜感激。

1 个答案:

答案 0 :(得分:0)

事实证明,上面的代码是正确的方法,但是我犯了一个错误。我实际上已经使用该方法计算了测试数据的哈希值

byte[] HashAlgorithm.ComputeHash(byte[] buffer)

,这就是我试图签名的测试数据的哈希值。我上面的测试数据应该看起来像

     byte[] testData = null;
     using (SHA256 sha256 = SHA256.Create())
     {
        testData = sha256.ComputeHash("JoePesciWasGreatInGoodfellas");
     }

我没有意识到计算哈希值会带来不同。

我用来对散列的测试数据进行签名的正确调用原来是

byte[] signatureECDSA = eCDsaCng.SignHash(testData);

这是最终更正后的代码:

byte[] cngBlob; // This was calculated based on another StackOverFlow post
byte[] testData = null;
using (SHA256 sha256 = SHA256.Create())
{
    testData = sha256.ComputeHash("JoePesciWasGreatInGoodfellas");
}
CngKey cngKey         = CngKey.Import(cngBlob, CngKeyBlobFormat.EccPrivateBlob);
ECDsaCng eCDsaCng     = new ECDsaCng(cngKey);
byte[] signatureECDSA = eCDsaCng.SignHash(testData);

注意:如先前的文章所述,请参考Microsoft CNG | How to import PEM encoded ECDSA private key into MS Key Storage Provider上的详细信息,以了解如何从PEM文件中的私钥创建cngBlob。