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;

p12解析流程_解析P12证书 | 学步园相关推荐

  1. p12解析流程_解析p12格式的程序(提取公钥和私钥)

    公钥和私钥 在现代密码体制中加密和解密是采用不同的密钥(公开密钥),也就是非对称密钥密码系统,每个通信方均需要两个密钥,即公钥和私钥,这两把密钥可以互为加解密.公钥是公开的,不需要保密,而私钥是由个人 ...

  2. p12解析流程_OpenSSL 解析P12格式证书文件

    a) openssl dsaparam -out dsaparam 1024 b) openssl gendsa -out dsakey dsaparam 3.2 生成ca待签名证书 openssl ...

  3. 7z apache解析漏洞_解析漏洞(Web漏洞及防御)

    概述 Web容器解析漏洞会将其他类型的文件当作脚本语言的文件进行解析! (由于Web容器自身的漏洞,导致一些特殊文件被 IIS.apache.nginx 或其他 Web服务器在某种情况下解释成脚本文件 ...

  4. Dom4j解析器_解析xml文档

    为什么80%的码农都做不了架构师?>>>    目录     1.Dom4J是什么     2.使用dom4j解析xml     3.使用dom4j查询xml     4.使用dom ...

  5. 硬解析优化_解析!解析!598元的山灵动圈耳机大杀器,横评对比心慌慌

    山灵自千元价位推出超值感三动铁耳机AE3之后,又很快在中端价位放出一款动圈耳机--ME80,目前官方售价598元. 下面谈谈: 包装如上,一如既往的精美和国际化. 看盒子上的图都能发现体积比曾经ME1 ...

  6. java 解析 manifest_解析AndroidManifest.xml之AXMLParser.java | 学步园

    解析AndroidManifest.xml 源码地址: http://code.google.com/p/android4me/source/browse/src/android4me/res/AXM ...

  7. java 短地址_URL短地址压缩算法 微博短地址原理解析(再转与Java实现) | 学步园

    主要是一次发新浪微博,发网址时看到网址被压缩了,才对这个有兴趣,于是查了查,查到这些 和其Java实现的博文 对第一篇博文,留了疑问,主要是觉得于四个得到的压缩地址中取一个,那之前循环计算不是有些浪费 ...

  8. java导出证书_Java导出和导入证书 | 学步园

    Java导出和导入证书 导出和导入证书 为了解释清楚如何输出和输入证书,我会使用我自己的 HTTPS 服务器.这个服务器在第一部分中讨论过.然后,跟着下面的内容开始: 1.运行 HTTPS 服务器,像 ...

  9. java快照_网页快照 java 实现 | 学步园

    cping1982 大哥真的很厉害愿意开源写代码给大家 先在的优秀程序员能想他一样的真少见 敬礼 import java.awt.BorderLayout; import java.awt.Dimen ...

  10. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

最新文章

  1. iOS架构-c++工程在Mac下编译成.a库并调用(12)
  2. Java十个数比大小循环_java for循环完成输出(1,1,2,3,5,8,13,21,34...)求出第10个数是多少?...
  3. jQuery操作元素属性
  4. 计组第一章(唐朔飞)——计算机系统概述章节总结
  5. .NET(c#) 移动APP开发平台 - Smobiler(1)
  6. Java开发中如何用JDBC连接起数据库?
  7. python二重积分0到正无穷_python函数的数值二重积分
  8. Cognos8.3 + oracle9i数据集市 建cube性能调整
  9. URLLoader 类和 URLVariables 类
  10. Java项目:医院门诊收费管理系统(java+html+jdbc+mysql)
  11. java怎么打印课程表_自明排课系统如何打印?教你打印课表的方法
  12. [Windows] 专业的家谱族谱制作软件My Family Tree v10.3.4
  13. php网站登录界面验证码打不开,php网站无法显示验证码
  14. Thinkpad8在Windows10下假关机的解决办法
  15. 使用 SASS 混合器 和@media 适应分辨率变化
  16. NUC980 PWM
  17. 小学期破防:BIT计科大二小学期的个人见解以及建议
  18. Elasticsearch学习笔记:MUST_NOT not working with EXIST in NESTED query
  19. html学习阶段总结2
  20. jsonobject返回map_如何把JSON对象转为map对象

热门文章

  1. 《别闹了,费曼先生》1
  2. Linux 操作系统课程设计
  3. 戴尔服务器修改分辨率,dell显示器怎么设置分辨率
  4. 联想笔记本修复计算机还原系统失败,联想笔记本电脑重装系统不成功,联想笔记本系统恢复...
  5. 《华为工作法》学习笔记
  6. 十步一拆:iPhone4S拆机十步曲
  7. 关于小凡模拟器设置完后找不到所要配置文件的问题
  8. 独家 | 盘点大数据标准化政策、组织及进展(附PPT下载)
  9. 不能为属性:[commandName]找到setter 方法
  10. 《快播》仿网易云音乐UI,在线视频,在线图片的开源项目