2013-12-17 5 views
0

Я хочу получить серийный номер сертификата с помощью кода vC++.Как получить серийный номер сертификата с помощью vC++

HANDLE hStoreHandle; 
PCCERT_CONTEXT pCertContext=NULL; 
PCERT_PUBLIC_KEY_INFO pOldPubKey = NULL; 
char fResponse ='n'; 
hStoreHandle = CertOpenSystemStore(NULL,"MY"); 

while(pCertContext= CertEnumCertificatesInStore(hStoreHandle,pCertContext)) 
{ 
    CString strSubVal,strResult,strInput; 

    BYTE *pbName=pCertContext->pCertInfo->SerialNumber.pbData; 
    } 

я думаю, что приведенный выше код, имеющий данные theserial номер, но я не знаю, как получить его в CString format.Guide мне

+0

@peter: им с выше код, но я не знаю, как получить его на CString – sivanesan1

ответ

1

копия вставьте следующий код

#include <stdio.h>//yourDialog.cpp file 
#include <windows.h> 
#include <Wincrypt.h> 
#include <iostream> 
#include <conio.h> 
#include <string> 
using namespace std; 
#pragma comment(lib, "crypt32.lib") 
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) 

#define KEYLENGTH 0x00800000 

PCCERT_CONTEXT pCertContext=NULL; 
HANDLE hStoreHandle;  
PCERT_PUBLIC_KEY_INFO pOldPubKey = NULL; 
char fResponse ='n'; 
hStoreHandle = CertOpenSystemStore(NULL,"MY"); 
pCertContext= CertEnumCertificatesInStore(hStoreHandle,pCertContext); 
PCERT_INFO pCertifInfo = pCertContext->pCertInfo; 
BYTE* pbData = pCertifInfo->SerialNumber.pbData; 
DWORD cbData = pCertifInfo->SerialNumber.cbData; 
char hex_ascii[3]; 
CString csAscii; 
csAscii.Empty(); 

if (cbData > 0) 
{ 
    int i; 
    CString cs; 
    for (i=0; i < cbData; i++) 
    { 
    BYTE bb = (BYTE) pbData[i]; 
    sprintf(hex_ascii, "%02X", bb); 
    cs.Format("%s", hex_ascii);  
    csAscii = cs + csAscii ; 
    } 
} 
+0

Тест 'if (csAscii.IsEmpty()) бесполезен, потому что вы точно знаете, что csAscii пуст, вы опустошили его 11 строк выше (' csAscii.Empty(); ') –

+0

@Michael Это не так, csAscii' заселяется внутри цикла. Однако проверка - это braindead. Весь 'if'-mayhem может быть записан как:' cs + = csAscii; '. Этого следует ожидать от кого-то, который маркирует код как «копировать и вставлять», не думайте »*. – IInspectable

+0

@Инспективный: да, это на самом деле то, что я имел в виду. –

1

Не уверен, если вы хотите: код, приведенный ниже помещает данные в виде шестнадцатеричной строки (theString)

BYTE *pbName=pCertContext->pCertInfo->SerialNumber.pbData; 
CString theString ; 
for (int i = 0; i < pCertContext->pCertInfo->SerialNumber.cbData; i++) 
{ 
    CString hex ; 
    hex.Format("%02x", pbName[i]) ; 
    theString += hex ; 
} 

код выше даст вам серийный номер «в обратном направлении». Вы можете подтвердить это, просмотрев серийный номер в сертификате, используя инструмент certmgr.msc.

Чтобы получить серийный номер в правильном порядке, просто измените направление цикла for. Ниже модифицированная версия кода, приведенные выше:

BYTE *pbName=pCertContext->pCertInfo->SerialNumber.pbData; 
CString theString ; 
for (int i = pCertContext->pCertInfo->SerialNumber.cbData - 1; i >= 0 ; i--) 
{ 
    CString hex ; 
    hex.Format("%02x", pbName[i]) ; 
    theString += hex ; 
}