繁体   English   中英

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

[英]How to import private key in PEM format using WinCrypt and C++?

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

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

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

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

和 :

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

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

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

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

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

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

我希望这将有所帮助。

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

  1. 使用CryptStringToBinaryACRYPT_STRING_BASE64HEADER解码 PEM
  2. 使用CryptDecodeObjectPKCS_7_ASN_ENCODINGPKCS_ENCRYPTED_PRIVATE_KEY_INFO解码 ASN.1 数据
    • 这会产生一些关于如何加密密钥和实际加密数据的信息。 在我的例子中,密钥来自 OpenSSL,加密由RFC 8018, 附录 A.4描述。
    • 我不得不手动编写一些代码来解析这个结构,因为CryptDecodeObject本身并不支持它。 您可以在此处找到该代码。
  3. 一旦您获得了私钥的加密以及有关如何派生对称密钥和解密它的算法的信息(在我的情况下是 PBKDF2 和 AES-256-CBC):
    1. 使用BCryptDeriveKeyPBKDF2从密码中导出加密密钥
    2. 使用BCryptDecrypt使用从密码派生的对称密钥解密私钥。
  4. CryptDecodeObjectPKCS_7_ASN_ENCODINGPKCS_PRIVATE_KEY_INFO
  5. 在上一步生成的PrivateKey数据成员上使用CryptDecodeObjectPKCS_7_ASN_ENCODINGPKCS_RSA_PRIVATE_KEY

最后一步的输出是RSA Private Key BLOB 这可以使用BCryptImportKeyPairLEGACY_RSAPRIVATE_BLOB导入。 同样,可以在此处找到演示所有这些的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM