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 常務副總經理...