一只川川木 2023-09-05 12:05 采纳率: 33.3%
浏览 29
已结题

C语言:从证书字符串中,解析出公钥

最近遇到个需求,需要从证书字符串(不是文件,是一串字符串),解析出公钥(rsa_st格式)

即,我已经从证书中提取到公钥,只不过这个公钥是unsigned char *p_key格式的

不能进行后续的处理

我在调查时,发现有一位老哥用GO语言做出来了,但是分析了一下,似乎无法借鉴到C语言工程中
链接:https://blog.csdn.net/FFDreamer/article/details/122165634

所以想问问各位老哥,有没有知道相应的接口,或者处理方法
谢谢。

  • 写回答

2条回答 默认 最新

  • 赵4老师 2023-09-05 13:56
    关注

    仅供参考:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define BASE64_VALUE_SZ 256
    int     base64_value[BASE64_VALUE_SZ];
    const unsigned char alphabet[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    class Base64Utility {
    public:
        Base64Utility();
        int base64_encode(char *src, int srclen, char *dst, int tail);
        int base64_decode(char *src, int srclen, char *dst);
    private:
        void base_64_init(void);
    };
    Base64Utility::Base64Utility() {
        base_64_init();
    }
    void Base64Utility::base_64_init(void) {
        int i;
    
        for (i = 0; i < BASE64_VALUE_SZ; i++) base64_value[i] = -1;
        for (i = 0; i < 64; i++) base64_value[(int) alphabet[i]] = i;
        base64_value['='] = 0;
    }
    int Base64Utility::base64_encode(char *src, int srclen, char *dst, int tail) {
        int     bits, char_count, len;
        char    *o_char, *lim, *o_lim;
        unsigned char   c;
    
        if ( !src || !dst) return 0;
        len = srclen;
        lim = src + len;
        o_char = dst;
        o_lim  = dst + (len*4)/3 + 1;
        char_count = 0;
        bits = 0;
        while ( (src < lim) && (o_char < o_lim)) {
            c = *(src++);
            bits += c;
            char_count++;
            if (char_count == 3) {
                *(o_char++) = alphabet[bits >> 18];
                *(o_char++) = alphabet[(bits >> 12) & 0x3f];
                *(o_char++) = alphabet[(bits >> 6) & 0x3f];
                *(o_char++) = alphabet[bits & 0x3f];
                bits = 0;
                char_count = 0;
            } else {
                bits <<= 8;
            }
        }
        if (char_count != 0) {
            bits <<= 16 - (8 * char_count);
            *(o_char++) = alphabet[bits >> 18];
            *(o_char++) = alphabet[(bits >> 12) & 0x3f];
            if (char_count == 1) {
                if (tail) {
                    *(o_char++) = '=';
                    *(o_char++) = '=';
                }
            } else {
                *(o_char++) = alphabet[(bits >> 6) & 0x3f];
                if (tail) {
                    *(o_char++) = '=';
                }
            }
        }
        *(o_char) = 0;
        return strlen(dst);
    }
    int Base64Utility::base64_decode(char *src, int srclen, char *dst) {
        int j;
        unsigned int k;
        int c, base_result_sz;
        long val;
    
        if (!src || !dst) return 0;
        base_result_sz = srclen;
        val = c = 0;
        for (j = 0; *src; src++) {
            k = (int) *src % BASE64_VALUE_SZ;
            if (base64_value[k] < 0) continue;
            val <<= 6;
            val += base64_value[k];
            if (++c < 4) continue;
            dst[j++] = (char) (val >> 16);
            dst[j++] = (val >> 8) & 0xff;
            dst[j++] = val & 0xff;
            val = c = 0;
        }
        switch (c) {
            case 2://xxxxxx xx0000
                dst[j++] = (val >> 4) & 0xff;
            break;
            case 3://XXXXXX XXxxxx xxxx00
                dst[j++] = (char) (val >> 10);
                dst[j++] = (val >> 2) & 0xff;
            break;
        }
        return j;
    }
    Base64Utility b64u;
    #define MAXLENS 1048576
    #define MAXLEND 1405092 //1048576*1.34
    char bufd[MAXLEND];
    char bufs[MAXLENS];
    FILE *fs,*fd;
    int fsize;
    int main(int argc,char *argv[]) {
        if (argc<4) {
        USE:
            printf("%s <-e|-E|-d> srcfile desfile\n",argv[0]);
            return 1;
        }
        if (stricmp(argv[1],"-e") && stricmp(argv[1],"-d")) goto USE;
        if (0==stricmp(argv[1],"-e")) {
            fs=fopen(argv[2],"rb");
            if (NULL==fs) {
                printf("Can not open file %s!\n",argv[2]);
                return 2;
            }
            fsize=fread(bufs,1,MAXLENS,fs);
            if (fsize<=0) {
                fclose(fs);
                printf("Can not read file %s!\n",argv[2]);
                return 3;
            }
            if (MAXLENS==fsize) printf("Warning: Up to %d bytes.\n",MAXLENS);
            fclose(fs);
            b64u.base64_encode(bufs,fsize,bufd,('E'==argv[2][1]));
            fd=fopen(argv[3],"w");
            if (NULL==fd) {
                printf("Can not create file %s!\n",argv[3]);
                return 4;
            }
            fprintf(fd,"%s",bufd);
            fclose(fd);
        } else {//0==stricmp(argv[1],"-d")
            fd=fopen(argv[2],"rb");
            if (NULL==fd) {
                printf("Can not open file %s!\n",argv[2]);
                return 2;
            }
            fsize=fread(bufd,1,MAXLEND,fd);
            if (fsize<=0) {
                fclose(fd);
                printf("Can not read file %s!\n",argv[2]);
                return 3;
            }
            if (MAXLEND==fsize) printf("Warning: Up to %d bytes.\n",MAXLEND);
            fclose(fd);
            fsize=b64u.base64_decode(bufd,fsize,bufs);
            fs=fopen(argv[3],"wb");
            if (NULL==fs) {
                printf("Can not create file %s!\n",argv[3]);
                return 4;
            }
            if (fsize!=(int)fwrite(bufs,1,fsize,fs)) {
                printf("Write %s error!\n",argv[3]);
                fclose(fs);
                return 5;
            }
            fclose(fs);
        }
        return 0;
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月27日
  • 修改了问题 9月5日
  • 创建了问题 9月5日

悬赏问题

  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题