使用CryptoAPI使用不可导出的私钥进行解密
Decrypt using a non-exportable private key with CryptoAPI
我在windows密钥存储中创建了RSA密钥对。
我成功加密了数据(对称密钥):
HCERTSTORE hstore = ::CertOpenSystemStore(NULL, L"TestStore");
PCCERT_CONTEXT pctxt = ::CertFindCertificateInStore(hstore, X509_ASN_ENCODING, NULL,
CERT_FIND_SUBJECT_STR, L"My Test Keys", NULL);
HCRYPTPROV hprovider = NULL;
if(!::CryptAcquireContext(&hprovider,
NULL,
MS_ENHANCED_PROV,
PROV_RSA_FULL,
NULL/*CRYPT_NEWKEYSET*/))
{
DWORD err = ::GetLastError();
return 0;
}
HCRYPTKEY hkey = NULL;
if(!::CryptImportPublicKeyInfo(hprovider,
X509_ASN_ENCODING,
&pctxt->pCertInfo->SubjectPublicKeyInfo,
&hkey
))
{
return 0;
}
现在我将CryptEncrypt()与HCRYPTKEY一起使用。
接下来我想用私钥解密数据,但它是不可导出的。我看到的所有示例都包括导入密钥。
如何在不导出密钥的情况下解密数据?
好吧,我不是RSA/Microsoft商店的专家,但我想我明白你在这里要做的。你做得有点倒退。您正在使用公钥进行加密,而私钥进行解密。因此,假设您拥有私钥,因为私钥是您用来生成公钥的。
所以,让我们看看。。。要解密数据,你需要一个密钥,对吧?因此,你可以(a)用公钥加密数据,然后找到导出私钥的方法,但之后你会使用类似于私钥加密的方法,无论如何你最好使用blowfish,或者(b)用私钥加密数据,这样你就可以共享公钥进行解密。记住CryptImportPublicKeyInfo返回一个句柄:http://msdn.microsoft.com/en-us/library/windows/desktop/aa380209(v=vs.85).aspx
所以我想说的是,你已经有了答案。当你说你有一个对称密钥时,它就在那里。要么使用相同的公钥进行解密,要么进行简单的转换:http://en.wikipedia.org/wiki/Symmetric-key_algorithm
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何在C++中使用X509证书模在令牌中查找私钥
- 私钥解密代码使用公共接口说明符到 BSAFE 库 v6.0?
- 从字符串 Crypto++ 导入 RSA 公钥/私钥
- 将私钥和证书存储在C++/OpenSSL中
- 区块链超级账本私钥错误
- 博坦加载现有的 RSA 私钥
- C 从XML导入CAPI/CNG中的RSA私钥
- 使用密码将 RSA 私钥写入 PEM 文件
- 一代 RSA-2048 密钥(公钥和私钥)
- 如何获取PCCERT_CONTEXT私钥的NCRYPT_KEY_HANDLE?
- 将ECDSA Keypair的公共和私钥分开
- RSA 私钥加密 QT C++
- 在 SSH 上的公钥-私钥身份验证上的 libcurl 实现
- 使用 openssl libcrypto 解密具有 RSA 私钥的数据时RSA_NO_PADDING的使用
- 使用 WinInet 的客户端身份验证(证书 + 私钥)
- OpenSSL AES_CFB128_ENCRYPT公共/私钥C
- 如何通过PKCS#11 API从电子令牌获取私钥
- 用于 RSA 解密C++的私钥
- 使用CryptoAPI使用不可导出的私钥进行解密