Как получить серийный номер сертификата в шестнадцатеричной строке формата, используя cryptoapi? - PullRequest
0 голосов
/ 15 октября 2011

Как получить серийный номер сертификата в шестнадцатеричном формате с использованием cryptoapi?Я попытался использовать

LPTSTR pszSerial = NULL;
    DWORD cbSerial = 0;
    CryptBinaryToString(pCertContext->pCertInfo->SerialNumber.pbData,pCertContext->pCertInfo->SerialNumber.cbData,CRYPT_STRING_HEX,NULL,&cbSerial);
    pszSerial = new TCHAR[cbSerial];
    CryptBinaryToString(pCertContext->pCertInfo->SerialNumber.pbData,pCertContext->pCertInfo->SerialNumber.cbData,CRYPT_STRING_HEX,pszSerial,&cbSerial);

Но результат не тот, который я хочу, я могу получить серийный номер, но он поменялся местами.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2015

Я знаю, что прошло 4 года после того, как был задан вопрос, но я много раз получал эту страницу, когда искал решение этой проблемы - так что, возможно, я не единственный человек, и мой ответ кому-нибудь поможет;)

Я нашел информацию, что серийный номер переставлен в struct _CERT_INFO, поэтому байты из certInfo.SerialNumber.pbData должны быть обращены.Кроме того, вы должны взять только certInfo.SerialNumber.cbData байт (cbData - длина серийного номера).Это важно, потому что, когда я пытался использовать целые pbData, я получал много мусорных байт.

Когда я перевернул байты, я конвертировал их в шестнадцатеричные.И это все;)

Мой код:

unsigned char* pbData = pCertContext->pCertInfo->SerialNumber.pbData;
int cbData = pCertContext->pCertInfo->SerialNumber.cbData;

std::string serial((char*)pbData);
std::string serialSubstring = serial.substr(0,cbData);
std::reverse(serialSubstring.begin(), serialSubstring.end());
String snInHex(string_to_hex(serialSubstring).c_str());
//now snInHex contains serial number in hexadecimal string

Дополнительная функция - serial number как номер! Когда вам нужен серийный номер в качестве данных (например, длясоздать xades файл):

unsigned int sNumber;
std::stringstream ss;
ss << std::hex << snInHex.c_str();
ss >> sNumber;
//now serial number is stored as number in sNumber

Редактировать

string_to_hec функция была взята отсюда: C ++ преобразовать строку в шестнадцатеричное и наоборот

0 голосов
/ 17 октября 2011

В следующем фрагменте показано, как изменить серийный номер сертификата.

for( int i = 0 ; i < pCertContext->pCertInfo->SerialNumber.cbData ; i ++ )
{
    CertSerialNo[i] = *( pCertContext->pCertInfo->SerialNumber.pbData 
                            + pCertContext->pCertInfo->SerialNumber.cbData - i - 1 ) ;
}
...