5

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

但是现在,我的问题是对private key做同样的事情。任何帮助将不胜感激:) 谢谢。

4

2 回答 2

10

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

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

我希望这将有所帮助。

于 2012-05-31T03:56:14.043 回答
2

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

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

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

于 2020-11-16T20:10:38.733 回答