如何解决如何从签名数据中获取 HCRYPTKEY?
我正在尝试使用 CryptGetUserKey
方法从我商店中的证书获取私钥,然后使用 CryptSignHash
方法,该方法需要在第一个参数中获得函数 { {1}} 的参数中,您需要将证书中的私钥 CryptCreateHash
,但我收到错误 HCRYPTKEY
。在此之前,我使用名称加密提供程序初始化 NTE_NO_KEY
:
HCRYPTPROV
然后我以这种方式初始化描述符 HCRYPTPROV PHProv;
if (!CryptAcquireContext(&PHProv,NULL,L"Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",PROV_RSA_FULL,CRYPT_VERIFYCONTEXT))
{
if (NTE_KEYSET_NOT_DEF == GetLastError())
{
printf("provider is not found");
}
else {
std::cout << GetLastError();
}
return 1;
}
:
HSTORE
并通过方法HCERTSTORE hStoreHandle;
hStoreHandle = CertOpenSystemStore(PHProv,L"MY");
if (hStoreHandle)
{
printf("The MY store is open. \n");
}
else
{
printf("Error getting store handle.");
}
获取证书并获取CertFindCertificateInStore
此代码:
HCRYPTKEY
但是我没有从证书中获取密钥,而是收到错误 PCCERT_CONTEXT pRecipientCert = NULL;
DWORD PropId = CERT_KEY_PROV_INFO_PROP_ID;
pRecipientCert = CertFindCertificateInStore(
hStoreHandle,CERT_FIND_PROPERTY,&PropId,pRecipientCert
);
std::cout << "Open certificate" << std::endl;
HCRYPTKEY phUserKey;
if (CertSetCertificateContextProperty(
pRecipientCert,CERT_SET_KEY_PROV_HANDLE_PROP_ID,&PHProv
)
)
{
std::cout << "Success CertSetCertificateContextProperty" << std::endl;
}
if (CryptGetUserKey(PHProv,AT_KEYEXCHANGE,&phUserKey))
{
std::cout << "Success CryptGetUserKey" << std::endl;
}
else
{
if(NTE_NO_KEY == GetLastError())
std::cout << "[ERROR] The key requested by the dwKeySpec parameter does not exist." << std::endl;
}
。
也许你有一个如何正确从证书中获取密钥的例子,否则你会发现我的代码有错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。