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

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


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C/C++获取计算机的硬盘序列号和显卡序列号是一个稍微复杂的任务,因为C/C++本身并没有提供直接的函数或API来获取这些信息。以下是一种可能的实现方式: 获取硬盘序列号: 在Windows系统上,你可以使用WMI接口来获取硬盘序列号。具体来说,可以使用`Win32_DiskDrive`类和`SerialNumber`属性来获取硬盘的序列号。你可以使用C/C++调用WMI接口的方式来实现。 在Linux系统上,你可以通过读取设备文件`/dev/sd*`来获取硬盘序列号。具体来说,你可以打开设备文件,然后使用`HDIO_GET_IDENTITY` ioctl命令来获取硬盘的身份信息,其中包括序列号获取显卡序列号: 在Windows系统上,你可以使用WMI接口来获取显卡序列号。具体来说,可以使用`Win32_VideoController`类和`PNPDeviceID`属性来获取显卡的唯一标识符。同样,你可以通过C/C++调用WMI接口的方式来实现。 在Linux系统上,你可以通过读取显卡设备文件或者执行特定命令来获取显卡信息。具体的实现方式可能因为显卡类型和操作系统的差异而有所不同。你可以尝试使用命令行工具如`lspci`或者读取设备文件`/sys/class/drm/card*/device/uevent`来获取显卡信息。 请注意,以上提到的方法可能需要特权或系统级的操作,并且在不同的操作系统上实现方式可能有所差异。在实际应用中,建议先了解目标平台的相关文档和API,以确定最适合你的环境的方法来获取硬盘序列号和显卡序列号

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值