返回> 网站首页 

基于CryptoApi创建根证书的私钥、公钥

yoours2011-09-05 14:29:27 阅读 1142

简介一边听听音乐,一边写写文章。

// 获得随机生成的密钥对
if(!CryptGenKey(hCertProv, AT_SIGNATURE, CRYPT_EXPORTABLE, &hKeySign))
{
TRACE(_T("CryptGenKey error 0x%x\n"), GetLastError());
return FALSE;
}

        。。。。。。。。。。
// 获得公钥
TRACE(_T("CryptExportKey...\n"));
if(!CryptExportKey(hKeySign, NULL, PUBLICKEYBLOB, 0, pbPublicKey, &dwPublicKeyLen))
{
TRACE(_T("CryptExportKey error 0x%x\n"), GetLastError());
return FALSE;
}
        。。。。。。。。。。
//创建自签名的根证书
if(!(pCertCtxSign = CertCreateSelfSignCertificate(
hCertProv, //CSP句柄
&certName, //证书客体名称数据结构指针
0, //标志位。默认行为,创建私钥信息,创建签名
NULL, //密钥信息结构
NULL, //签名算法,null表示默认算法SHA1RSA
NULL, //有效期起始时间 ,null表示取当前系统时间
&cs, //有效期终止时间, null表示起始时间加1年
NULL)))//未设置扩展属性
{
TRACE("创建根证书失败!\n");
}else{
TRACE("创建自签名证书成功!\n");
}

      上面生成的公钥与根证书生成后生成的公钥不一致,以为不正确。后经各方查找资料发现,需要将公钥导入新创建临时密钥容器,然后再进行导出,他们就一致了。
1.创建临时密钥容器
HCRYPTPROV hTmpProv = NULL;
if (RCRYPT_FAILED(CryptAcquireContext(&hTmpProv, "My_Temporary_Container", NULL, PROV_RSA_AES, CRYPT_NEWKEYSET)))    // NULL表示使用系统默认CSP
{
    if (RCRYPT_FAILED(CryptAcquireContext(&hTmpProv, "My_Temporary_Container", NULL, PROV_RSA_AES, 0)))    // NULL表示使用系统默认CSP
    {
        CertFreeCertificateContext(pCertContext);
        return NTE_FAIL;
    }
}
 
2.向容器中导入公钥,获取公钥句柄
HCRYPTKEY hKey = NULL;
CERT_PUBLIC_KEY_INFO certPubKeyInfo = pCertContext->pCertInfo->SubjectPublicKeyInfo;
CryptImportPublicKeyInfo(hTmpProv, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, &certPubKeyInfo, &hKey);
 
3.导出公钥(最好采用二次调用方式)
unsigned char* pBuf = NULL;
unsigned long ulBufLen = 0;
CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, pBuf, &ulBufLen);
pBuf = new unsigned char[ulBufLen];
memset(pBuf, 0, ulBufLen);
CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, pBuf, &ulBufLen);
微信小程序扫码登陆

文章评论

1142人参与,0条评论