如何使用WinCrypt和C++导入PEM格式的私钥?

发布于 2024-12-20 02:31:06 字数 1151 浏览 2 评论 0原文

我正在尝试在 C++ 中使用 WinCrypt API

我的应用程序需要加密、解密、签名和验证文件,一旦获得正确的密钥,我就知道如何做到这一点。但我的问题实际上是,这不是生成这些密钥的同一个应用程序。

我拥有的是 PEM 格式文件中的公钥和私钥:

-----BEGIN RSA PRIVATE KEY-----
[Base64 encoded]
-----END RSA PRIVATE KEY-----

并且:

-----BEGIN RSA PUBLIC KEY-----
[Base64 encoded]
-----END RSA PUBLIC KEY-----

经过一番研究,我找到了如何导入公钥: 此处此处,使用以下方法:

  • CreateFile & ReadFile读取文件内容
  • CryptStringToBinary,使用CRYPT_STRING_BASE64HEADER从PEM格式转换为DER格式(删除页眉和页脚并从base64解码)
  • <带有X509_PUBLIC_KEY_INFO的strong>CryptDecodeObjectEx
  • CryptImportPublicKeyInfo,导入密钥

但是现在,我的问题是使用私钥做同样的事情。 任何帮助将非常非常感激:) 谢谢。

I'm trying to use the WinCrypt API in C++.

My application need to cipher, decipher, sign and verify files, and I know how to do that once I have the correct keys. But my problem is actually that that is NOT the same application which generates those keys.

What I have is public and private keys in files in PEM format :

-----BEGIN RSA PRIVATE KEY-----
[Base64 encoded]
-----END RSA PRIVATE KEY-----

And :

-----BEGIN RSA PUBLIC KEY-----
[Base64 encoded]
-----END RSA PUBLIC KEY-----

After some research, I have found how to import the public key : here and here, using the following methods :

  • CreateFile & ReadFile to read the file content
  • CryptStringToBinary, with CRYPT_STRING_BASE64HEADER to convert from PEM format to DER format (remove header and footer and decode from base64)
  • CryptDecodeObjectEx with X509_PUBLIC_KEY_INFO
  • CryptImportPublicKeyInfo, to import the key

But now, my problem is to do the same thing whith the private key.
Any help would be really really appreciated :)
Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

围归者 2024-12-27 02:31:06

通过使用 CryptDecodeObjectExPKCS_RSA_PRIVATE_KEY,然后调用 CryptImportKey,可以将 PEM 私钥导入到 CAPI 中。

我编写了一个示例,演示如何使用 PEM 编码的 RSA 私钥通过 CAPI 对数据进行签名。这是它的链接:http://www.idrix.fr/Root/Samples/capi_pem.cpp

我希望这会有所帮助。

A PEM private key can be imported into CAPI by using CryptDecodeObjectEx with PKCS_RSA_PRIVATE_KEY and then calling CryptImportKey.

I have written a sample that shows how to use a PEM encoded RSA private key for signing data using CAPI. Here is a link to it : http://www.idrix.fr/Root/Samples/capi_pem.cpp

I hope this will help.

孤寂小茶 2024-12-27 02:31:06

我在使用 PEM 格式的加密私钥时遇到了这个问题。以下是我解密和导入它的过程:

  1. 使用 CryptStringToBinaryACRYPT_STRING_BASE64HEADER 解码 PEM
  2. 使用 CryptDecodeObject 和 <代码>PKCS_7_ASN_ENCODING和PKCS_ENCRYPTED_PRIVATE_KEY_INFO
    • 这会产生一些有关密钥加密方式和实际加密数据的信息。就我而言,密钥来自 OpenSSL,加密由 描述RFC 8018,附录 A.4
    • 我必须手动编写一些代码来解析此结构,因为 CryptDecodeObject 本身不支持它。您可以在此处.


  3. 一旦您获得了私钥的加密以及有关如何导出对称密钥以及使用哪种算法对其进行解密的信息(在我的例子中是 PBKDF2 和 AES-256-CBC):
    1. 使用BCryptDeriveKeyPBKDF2从密码中派生加密密钥
    2. 使用 BCryptDecrypt 使用从密码派生的对称密钥来解密私钥。
  4. CryptDecodeObjectPKCS_7_ASN_ENCODINGPKCS_PRIVATE_KEY_INFO 结合使用
  5. CryptDecodeObjectPKCS_7_ASN_ENCODINGPKCS_RSA_PRIVATE_KEY 结合使用 在前面生成的 PrivateKey 数据成员上 步。

最后一步的输出是 RSA 私钥 BLOB。可以使用 BCryptImportKeyPair 和 LEGACY_RSAPRIVATE_BLOB 导入。同样,可以找到演示所有这些的代码

I ran into this problem with an encrypted private key in PEM format. Here is the process I followed to decrypt and import it:

  1. Decode the PEM using CryptStringToBinaryA with CRYPT_STRING_BASE64HEADER
  2. Decode the ASN.1 data using CryptDecodeObject with PKCS_7_ASN_ENCODING and PKCS_ENCRYPTED_PRIVATE_KEY_INFO
    • This produces some information about how the key is encrypted and the actual encrypted data. In my case, the key came from OpenSSL, and the encryption is described by RFC 8018, Appendix A.4.
    • I had to manually write some code to parse out this structure as it's not natively supported by CryptDecodeObject. You can find that code here.
  3. Once you have the encryption of the private key and the information about how to derive the symmetric key and which algorithm to decrypt it (in my case PBKDF2 and AES-256-CBC):
    1. Use BCryptDeriveKeyPBKDF2 to derive the encryption key from the password
    2. Use BCryptDecrypt to decrypt the private key using the symmetric key derived from the password.
  4. Use CryptDecodeObject with PKCS_7_ASN_ENCODING and PKCS_PRIVATE_KEY_INFO
  5. Use CryptDecodeObject with PKCS_7_ASN_ENCODING and PKCS_RSA_PRIVATE_KEY on the PrivateKey data member produced in the previous step.

The output of this last step is an RSA Private Key BLOB. This can be imported with BCryptImportKeyPair and LEGACY_RSAPRIVATE_BLOB. Again, code demonstrating all of this can be found here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文