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);
    pszSerial = new TCHAR[cbSerial];
    CryptBinaryToString(pCertContext->pCertInfo->SerialNumber.pbData,pCertContext->pCertInfo->SerialNumber.cbData,CRYPT_STRING_HEX,pszSerial,&cbSerial);

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

最佳答案

我知道问题被问到已经 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

额外功能 - 序列号作为数字!当您需要序列号作为数据时(例如,创建 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

关于c++ - 如何使用 cryptoapi 获取十六进制格式字符串的证书序列号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7776656/

相关文章:

c++ - 指向方法的指针

c++ - 将拓扑排序的列表与原始列表进行比较

c# - ECDSA 登录 c# 在 c 中验证

delphi - 如何使用 Crypto API 解密 AES-256 加密的 zip 文件

linux-kernel - 如何在 linux 内核 2.6 中使用 CryptoAPI

C++ 错误 : deduced conflicting types for parameter 'T' string vs const char *

c++ - 在 Visual Studio 中写入文件时出错

java - 如何在Java中使用BouncyCaSTLe正确编码DH参数?

c++ - 将 DER 编码的 X509 证书缓冲区转换为 Windows CERT_CONTEXT 结构

c++ - 迭代 vector 返回相同的对象