我是密码学的新手,我想使用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签名?
我已经开始深入研究迷人的密码学世界,但是要花些时间才能熟悉它。我在正确的轨道上吗?在此期间,任何有助于我解决此问题的技巧将不胜感激。
答案 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。