我已将证书添加到系统存储中,其内容如下:
PCCERT_CONTEXT pCertContext;HCERTSTORE hCertStore;CRYPT_KEY_PROV_INFO provInfo;
if(pCertContext = …
所以我找到了下面的解决方案。所有非必要的理解代码都省略了。
迭代商店中的证书并通过其属性查找我的证书,然后使用 CryptDecodeObjectEx() 将键转换为的函数 RSA_CSP_PUBLICKEYBLOB 格式。
CryptDecodeObjectEx()
RSA_CSP_PUBLICKEYBLOB
钥匙保留在这个位置 pCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData 它的大小在 pCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData 。
pCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData
pCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData
HCERTSTORE hCertStore = NULL; PCCERT_CONTEXT pCertContext = NULL; PBYTE pbPKEY = NULL; DWORD iPKEYSize; hCertStore = CertOpenSystemStore(NULL, L"MY"); while(pCertContext = CertEnumCertificatesInStore( hCertStore, pCertContext)) { DWORD dwPropId = 0; while(dwPropId = CertEnumCertificateContextProperties( pCertContext, // The context whose properties are to be listed. dwPropId)) // Number of the last property found. { // ... // here I compare the properties to see if it is the certificate that I want. // ... CryptDecodeObjectEx((PKCS_7_ASN_ENCODING | X509_ASN_ENCODING), RSA_CSP_PUBLICKEYBLOB, pCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData, pCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &pbPKEY, &iPKEYSize); // pbData and pcbDataLen are output parameters of the function *pcbDataLen = iPKEYSize; memcpy(pbData, pbPKEY, *pcbDataLen); LocalFree((HANDLE)pbPKEY); } } }