如何使用vc ++获取证书序列号

时间:2013-12-17 12:25:43

标签: visual-c++ mfc cryptoapi

  

我想使用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格式获取它。指导我

2 个答案:

答案 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 ;
  }
}