如何使用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);
但结果不是我想要的,我可以得到序列号,但它反转。
答案 0 :(得分:2)
我知道问题已经问过4年了,但是当我在寻找这个问题的解决方案时,我多次得到这个页面 - 所以也许我不是唯一的人,我的回答会帮助别人;)
我发现信息,序列号在结构_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++ convert string to hexadecimal and vice versa
答案 1 :(得分:0)
以下代码段显示了如何撤消证书序列号。
for( int i = 0 ; i < pCertContext->pCertInfo->SerialNumber.cbData ; i ++ )
{
CertSerialNo[i] = *( pCertContext->pCertInfo->SerialNumber.pbData
+ pCertContext->pCertInfo->SerialNumber.cbData - i - 1 ) ;
}