您的位置:首页 > 编程语言 > C语言/C++

C++获取数字证书的序列号

2015-11-06 17:30 731 查看

C++获取数字证书的序列号

目录

C获取数字证书的序列号
目录
举个证书序列号的栗子

以下是一个简单的例子

转载请声明本文作者为天空中一米阳光

我们需要准备一个二进制的证书实体 或是 CRL,给出的例子可以直接解析出证书的序列号,而不需要通过任何的第三方的接口例如:openssl 、CryptoAPI

通过看ASN.1 得知:

INTEGER 为任意一个整数 该标记码为 0x02

asn.1这规范一般标记码后面是 长度

了解到证书的序列号的长度为 32字节 的十六进制的字符串

二进制的长度为16字节

举个证书序列号的栗子:

序列号 : ‎21 11 78 53 0b 64 aa 92 13 45 59 cd 49 f4 d8 c1

以下是一个简单的例子

/*
@作者:天空中的一米阳光
@由于我的环境是VS 2010 故用了fopen_s方法和sprintf_s方法
*/
#include<iostream>
#include<string>
using namespace std;

int main()
{
FILE *fp = NULL;
int iDataLen = 0;
unsigned char* crlData = NULL;
errno_t err;

//这里我是用的CRL ,用.cer的证书实体也是一样的
err = fopen_s(&fp,"crl.crl","rb+");
if (err!=0)
{
cout<<"File wasn't opened"<<endl;
return -1;
}
fseek(fp,0L,SEEK_END);
iDataLen = ftell(fp); //获取文件的大小
fseek(fp,0L,SEEK_SET);

crlData = new unsigned char[iDataLen+1];
memset(crlData,0x00,iDataLen+1);

fread(crlData,sizeof(unsigned char),iDataLen,fp);

int iCount = 0;
int i = 0;
iCount = iDataLen;
for ( i = 0;i<iDataLen;i++)
{
if (crlData[i]==2)
{
if (crlData[i+1]==16)
{
string strNum;
for (int j = 0;j<16;j++)
{
char str[3] = {0};
sprintf_s(str,3,"%02x",crlData[i+2]);//将二进制的数据转变为十六进制的字符串
strNum += str;
i++;
}
cout<<strNum<<endl;
}else{
continue;
}
}
}

fclose(fp);
delete[] crlData;
crlData = NULL;
return 0;
}


转载请声明本文作者为:天空中一米阳光

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: