我想使用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;
}
我认为上面的代码有这些数字数据,但我不知道如何以CString格式获取它。指导我
答案 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 ;
}
答案 1 :(得分: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 ;
}
}