C++ 如何使用cryptoapi获取十六进制格式字符串的证书序列号?

C++ 如何使用cryptoapi获取十六进制格式字符串的证书序列号?,c++,cryptoapi,C++,Cryptoapi,如何使用cryptoapi获取十六进制格式字符串的证书序列号? 我试过使用 LPTSTR pszSerial = NULL; DWORD cbSerial = 0; CryptBinaryToString(pCertContext->pCertInfo->SerialNumber.pbData,pCertContext->pCertInfo->SerialNumber.cbData,CRYPT_STRING_HEX,NULL,&cbSerial);

如何使用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);

但是结果不是我想要的,我可以得到序列号,但它是反向的。

下面的代码片段显示了如何反向证书序列号

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

以下代码片段显示了如何反转证书序列号

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

我知道问题提出已经四年了,但当我寻找这个问题的解决方案时,我多次看到这个页面-所以也许我不是唯一的人,我的回答会帮助别人;)

我找到的信息是,序列号在struct
\u CERT\u 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
额外功能-
序列号
作为编号
当您需要序列号作为数据时(例如,创建
xades
文件):

unsigned int sNumber;
std::stringstream-ss;
党卫队成员;
//现在序列号作为编号存储在sNumber中
编辑


string\u to\u hec
函数取自此处:

我知道问题提出已经四年了,但我在寻找这个问题的解决方案时多次看到这一页-所以也许我不是唯一的人,我的回答会帮助别人;)

我找到的信息是,序列号在struct
\u CERT\u 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
额外功能-
序列号
作为编号
当您需要序列号作为数据时(例如,创建
xades
文件):

unsigned int sNumber;
std::stringstream-ss;
党卫队成员;
//现在序列号作为编号存储在sNumber中
编辑

string\u to\u hec
函数取自此处: