p12解析流程 解析P12證書 學步園

2021-10-18 12:26:30 字數 2628 閱讀 1477

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;

cer證書,p12證書相關

最近做銀聯手機充值的一套東西,客戶端伺服器端一起做,好累呀。對方給了兩個 證書,a.p12 和 b.cer。a.p12中的私鑰很容易可以得到,但是b.cer中的公鑰卻怎麼都拿不到,害我查了大半天。原來 p12中也有公鑰。從p12中取金鑰 css view plain copy p12 cert ar...

資料結構 P12

include 鍊錶預備知識 typedef給資料型別 int char struct student.再取乙個名字,兩個都能用 2016年6月9日13 35 54 typedef struct student stt2 struct student資料型別再定義乙個新名字 stt 注 studen...

p12解析流程 MDQP12船舶製造過程控制程式

文件從網際網路中收集,已重新修正排版,word 目的對船舶製造過程中的要求進行控制,包括質控點和特殊過程的控制。旨在確保船舶製造過程的每個環節 均按照要求運作並處於受控狀態,從而確保船舶製造的質量和進度滿足建造合同及規範要求。適用範圍 本程式適用於本公司船舶製造全過程的控制。職責3.1 常務副總經理...