使用CryptoAPI使用不可导出的私钥解密

时间:2013-12-17 08:08:13

标签: c++ encryption keystore 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。


接下来我想用私钥解密数据,但它不可导出。我见过的所有例子都包括导入密钥。

如何在不导出密钥的情况下解密数据?

1 个答案:

答案 0 :(得分:0)

好吧,我不是RSA /微软商店的专家,但我想我得到了你想要做的事情。你有点倒退了。您使用公钥加密,私有解密。因此,假设您拥有私钥,因为这是您用来生成公钥的原因。

所以,让我们看看...解密你需要密钥的数据吧?因此,您可以(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