我正在尝试在C ++中使用WinCrypt API。
我的应用程序需要加密,解密,签名和验证文件,一旦我有正确的密钥,我就知道如何做到这一点。但我的问题实际上是,这与生成这些密钥的应用程序不同。
我所拥有的是PEM格式的文件中的公钥和私钥:
-----BEGIN RSA PRIVATE KEY-----
[Base64 encoded]
-----END RSA PRIVATE KEY-----
并且:
-----BEGIN RSA PUBLIC KEY-----
[Base64 encoded]
-----END RSA PUBLIC KEY-----
经过一些研究,我找到了如何使用以下方法导入公钥:here和here:
但是现在,我的问题是用私钥做同样的事情。 任何帮助真的很感激:) 谢谢。
答案 0 :(得分:8)
可以使用 CryptDecodeObjectEx 和 PKCS_RSA_PRIVATE_KEY 将PEM私钥导入CAPI,然后调用 CryptImportKey 。
我编写了一个示例,演示了如何使用PEM编码的RSA私钥来使用CAPI对数据进行签名。以下是指向它的链接:http://www.idrix.fr/Root/Samples/capi_pem.cpp
我希望这会有所帮助。
答案 1 :(得分:0)
我遇到了一个PEM格式的加密私钥问题。这是我解密并导入它的过程:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if(requestCode == RESOLVE_PHONE_NUMBER_HINT){
if (resultCode == RESULT_OK) {
var credential : Credential? = data?.getParcelableExtra(Credential.EXTRA_KEY)
credential?.apply {
processPhoneNumber(id)
}
}
}
和CryptStringToBinaryA
来解码PEM CRYPT_STRING_BASE64HEADER
和CryptDecodeObject
将PKCS_7_ASN_ENCODING
解码为ASN.1数据
PKCS_ENCRYPTED_PRIVATE_KEY_INFO
本身不支持该结构。您可以找到该代码here。CryptDecodeObject
从密码中获取加密密钥BCryptDeriveKeyPBKDF2
使用从密码派生的对称密钥解密私钥。BCryptDecrypt
与CryptDecodeObject
和PKCS_7_ASN_ENCODING
一起使用PKCS_PRIVATE_KEY_INFO
数据成员上,将CryptDecodeObject
与PKCS_7_ASN_ENCODING
和PKCS_RSA_PRIVATE_KEY
一起使用。最后一步的输出是RSA Private Key BLOB。可以使用PrivateKey
和BCryptImportKeyPair
导入。同样,可以在here中找到展示所有这些内容的代码。