【问题标题】:How to import private key in PEM format using WinCrypt and C++?如何使用 WinCrypt 和 C++ 导入 PEM 格式的私钥?
【发布时间】:2011-12-07 09:15:28
【问题描述】:

我正在尝试在 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,导入密钥

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

【问题讨论】:

  • Crypto API 用于专有加密,将其用于 PGP 很奇怪
  • 是的,当然。但事实是我无法选择密钥的格式:/ 否则我会选择 CryptoAPI 的专有格式。但是由于可以从 PEM 格式导入公钥,我认为使用私钥也可以。

标签: c++ windows cryptography cryptoapi pem


【解决方案1】:

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

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

我希望这会有所帮助。

【讨论】:

  • 谢谢穆尼尔。你把我从死胡同里救了出来。 (我试图获得 CRYPT_PRIVATE_KEY_INFO 没有成功,我怀疑我需要它)。
  • 任何想法如何使用 DSA 密钥做同样的事情?
【解决方案2】:

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

  1. 使用CryptStringToBinaryACRYPT_STRING_BASE64HEADER 解码PEM
  2. 使用CryptDecodeObjectPKCS_7_ASN_ENCODINGPKCS_ENCRYPTED_PRIVATE_KEY_INFO 解码ASN.1 数据
    • 这会产生一些关于如何加密密钥和实际加密数据的信息。在我的例子中,密钥来自 OpenSSL,加密由 RFC 8018, Appendix A.4 描述。
    • 我不得不手动编写一些代码来解析这个结构,因为CryptDecodeObject 本身并不支持它。您可以找到该代码here
  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 导入。同样,可以在 here 找到演示所有这些的代码。

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 2023-02-07
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多