解析P12证书

解析P12证书1.从磁盘上的证书文件中读取证书数据unsignedchar*pbP12Data;//证书数据unsignedlongulP12DataLen;//证书数据长度2.让用户输入证书密码char*szPwd;//证书密码3.将证书密码转换成UNICODE格式(最好采用二次调用方式)LPWSTRpWideChar=NULL;int

大家好,又见面了,我是你们的朋友全栈君。1.从磁盘上的证书文件中读取证书数据

unsigned char* pbP12Data; // 证书数据

unsigned long ulP12DataLen; // 证书数据长度

2.让用户输入证书密码

char* szPwd; // 证书密码

3.将证书密码转换成UNICODE格式(最好采用二次调用方式)

LPWSTR pWideChar = NULL;

int nWideChar = 0;

nWideChar = MultiByteToWideChar(CP_ACP, 0, szPwd, -1, pWideChar, nWideChar);

pWideChar = new WCHAR[nWideChar];

memset(pWideChar, 0, sizeof(WCHAR)*nWideChar);

MultiByteToWideChar(CP_ACP, 0, szPwd, -1, pWideChar, nWideChar);

4.将证书数据导入临时store

CRYPT_DATA_BLOB blob;

memset(&blob, 0, sizeof(blob));

blob.pbData = pbP12Data;

blob.cbData = ulP12DataLen;

HCERTSTORE hCertStore = NULL;

hCertStore = PFXImportCertStore(&blob, pWideChar, CRYPT_EXPORTABLE);

5.在store中查找证书,获取CertContext

PCCERT_CONTEXT pCertContext = CertFindCertificateInStore(hCertStore, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, NULL);

6.获取证书信息

CRYPT_INTEGER_BLOB snBlob = pCertContext->pCertInfo->SerialNumber; // 证书SN

pCertContext->pbCertEncoded; // X509格式证书数据

pCertContext->cbCertEncoded; // X509格式证书数据长度

7.获取CSP句柄

HCRYPTPROV hProv = NULL;

DWORD dwKeySpec = 0;

BOOL bCallerFreeProv = FALSE;

CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hProv, &dwKeySpec, &bCallerFreeProv);

8.获取密钥句柄

HCRYPTKEY hKey = NULL;

CryptGetUserKey(hProv, dwKeySpec, &hKey);

9.导出私钥(最好采用二次调用方式)

BYTE* pbData = NULL;

DWORD dwDataLen = 0;

CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, pbData, &dwDataLen);

pbData = new BYTE[dwDataLen];

memset(pbData, 0, dwDataLen);

CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, pbData, &dwDataLen);

10.获取公私钥信息

BYTE *p = pbData+ sizeof(PUBLICKEYSTRUC); 

(*(RSAPUBKEY*)p).bitlen; // 公私钥模长(以bit为单位)

(*(RSAPUBKEY*)p).pubexp; // 公钥的e(注意字节顺序)

p += sizeof(RSAPUBKEY); // 公私钥的n(注意字节顺序)

p += ((*(RSAPUBKEY*)p).bitlen)/8; // 私钥的p(注意字节顺序)

p += ((*(RSAPUBKEY*)p).bitlen)/16; // 私钥的q(注意字节顺序)

p += ((*(RSAPUBKEY*)p).bitlen)/16; // 私钥的dp(注意字节顺序)

p += ((*(RSAPUBKEY*)p).bitlen)/16; // 私钥的dq(注意字节顺序)

p += ((*(RSAPUBKEY*)p).bitlen)/16; // 私钥的qu(注意字节顺序)

p += ((*(RSAPUBKEY*)p).bitlen)/16; // 私钥的d(注意字节顺序)

11.清理工作

delete[] pbData;

pbData = NULL;

CryptDestroyKey(hKey);

CryptReleaseContext(hProv, 0);

CertFreeCertificateContext(pCertContext);

CertCloseStore(hCertStore, CERT_CLOSE_STORE_FORCE_FLAG);

delete[] pWideChar;

pWideChar = NULL;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148171.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • “密码保护共享”关不掉

    “密码保护共享”关不掉在连接网络打印机时,我开启主机了Guest用户,并在打印机上设置,结果连接不到主机,在"高级共享设置"中关闭了"密码保护共享",可关了保存后再打开,还是没有关闭

    2022年8月5日
    7
  • 10款好用的谷歌chrome浏览器插件、扩展程序,用起来很爽哦

    10款好用的谷歌chrome浏览器插件、扩展程序,用起来很爽哦TOP1:AdblockPlus介绍:AdblockPlus是Chrome浏览器中非常流行的一款广告拦截插件,AdblockPlus的用户多达数百万之多,在全球范围内都有很高的使用评价,AdblockPlus是由一个开源社区来维护。TOP2:OfficeEditingforDocs,Sheets&Slides介绍:officeediting是一款可…

    2022年4月29日
    89
  • android遍历的方法,android中遍历arrayList的四种方法

    android遍历的方法,android中遍历arrayList的四种方法一.在android中遍历arrayList有以下四种方法:1.实例:packagecom.mylist.test;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publicclassArrayListDemo{publicstaticvoidmain(Stringargs[])…

    2022年7月22日
    9
  • Maven 生成打包可执行jar包

    Maven 生成打包可执行jar包文章目录1.需求2.开发环境3.Maven打包插件介绍4.Maven使用maven-jar-plugin打可执行jar包5.Maven使用maven-assembly-plugin装需要打包的文件打进zip包6.Maven生成可执行jar包及zip项目压缩包7.执行jar包8.pom.xml配置9.package.xml文件最近IDEA打可执行Jar包搞了三天,一直失败,好好学…

    2022年5月30日
    31
  • pandas中的loc和iloc_pandas获取指定数据的行和列

    pandas中的loc和iloc_pandas获取指定数据的行和列实际操作中我们经常需要寻找数据的某行或者某列,这里介绍我在使用Pandas时用到的两种方法:iloc和loc。目录1.loc方法(1)读取第二行的值(2)读取第二列的值(3)同时读取某行某列(4)读取DataFrame的某个区域(5)根据条件读取(6)也可以进行切片操作2.iloc方法(1)读取第二行的值(2)读取第二行的值(3)同时读取某行某列(4)进行切片操作loc:通过行、列的名称或标签来索引iloc:通过行、列的索引位置来寻找数据..

    2022年8月30日
    5
  • 纯HTML/CSS实现简易超帅的登录界面【提供完整代码】[通俗易懂]

    纯HTML/CSS实现简易超帅的登录界面【提供完整代码】[通俗易懂]前言 ❤️我独自走过苍苍茫茫,与你同行才有了光❤️

    2022年5月2日
    97

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号