如何从签名数据中获取 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 (将#修改为@)