当前位置: 首页 > 知识库问答 >
问题:

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

马梓
2023-03-14

我对密码学很陌生,我正试图用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);

我尝试使用私钥文件计算字节[]cngBlob,基于Microsoft CNG|如何将PEM编码的ECDSA私钥导入MS密钥存储提供程序,但在byte[]signatureECDSA中没有得到正确答案。

我如何从文件中读入私钥,然后用它来计算测试数据的ECDSA签名?

我已经开始钻研密码学的迷人世界,但我需要一些时间来熟悉它。我走对了吗?在此期间,如果有任何提示可以帮助我解决这个问题,我将不胜感激。

共有1个答案

权承
2023-03-14

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

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的优秀信息|如何将PEM编码的ECDSA私钥导入MS密钥存储提供商,以查看如何从PEM文件中的私钥创建cngBlob。

 类似资料:
  • 最近,我一直在尝试构建一个Java库来解释和验证NZ Covid传递。在签名验证之前(这个过程中稍微重要的一部分),我已经让代码变得更好或更坏。完整的代码可以在这里找到,但是仍然很粗糙。 验证器本身在这里可用,有一个配套测试。新冠通行证的技术规范在这里。至少有一个相关部分。 在与另一个开发人员合作后,我想我已经确定了解释提供的公钥。下面的代码(删除了调试输出)。公钥详细信息来自这里 该错误可能存在

  • 我想为这个方法生成的公钥创建文件 因为我正在为移动应用程序生成此密钥,而他们无法读取,所以他们请求文件,而不是作为字符串的公钥 请各位指教,,

  • 我必须创建一个aes-256密钥并将其存储在。pem文件中。我使用创建一个256位的随机密钥。在此之后,我如何将此保存到一个pem文件。我已经研究了在C和openssl pem中读写pem文件的rsa密钥。但我不使用RSA密钥。 我怀疑我的任务要简单得多,比如从base64创建pem,但没有太多帮助。

  • 要使用OpenSSL生成私钥和公钥,我已经运行 我将公钥上传到远程服务器。然后将导入。Net Framework(它必须是。Net Framework)C#服务使用它来签署API有效负载: 用上面的代码给出 如果我使用并运行它会生成一个名为的PKCS#12密钥,然后: 使用<code>privateKeyFile=private-key.pem。p12上面的代码似乎对请求进行了签名,但API响应为

  • 我正在编写一个java程序,该程序应该生成私有rsa dsa ec密钥对并导出它们,程序还可以从pem文件中导入密钥。 导入密钥工作得很好,因为我已经使用bouncycastle从文件中读取对象,该文件将是并且以某种方式使用我可以读取加密的密钥。 现在的问题是,我正在尝试将私钥写到文件中,并且它应该被加密,我的问题是: 有没有方法使用类中内置的java或者使用bouncycastle或者我必须加密

  • 我使用RSA_public_encrypt函数发送加密数据到套接字。我正在读取公钥。使用"pkey=PEM_read_PUBKEY(f, NULL, NULL, NULL);"函数的PEM文件。从上面的函数中检索的pkey是类型EVP_PKEY*,我不能在函数RSA_public_encrypt中使用。(RSA_public_encrypt使用RSA*类型密钥) 如何将EVP_PKEY*PKEY转