繁体   English   中英

PEM转换(PKCS7)到DER-AKA Base64 C ++问题

[英]PEM Conversion (PKCS7) to DER - AKA Base64 C++ Problems

我刚刚完成了一些OpenSSL / PKCS7数字签名代码的编写,现在有一个有效的PEM编码的PKCS7文件。 因此,经过一番战斗之后,我需要将PEM转换为DER格式。 事实证明,这比我希望的要难。

OpenSSL中有一些方便的方法,例如“ PEM_write_bio_PKCS7_stream”来编写您的PKCS7对象。 但是经过大量的谷歌搜索和浏览了一些头文件之后,我似乎找不到任何东西来获取PKCS7对象并将其以DER格式写入任何东西(BIO,FILE,char *)。

因此感觉失败了,我转向解析PEM文件中的页眉和页脚,然后对内容进行Base64解码。 作为检查,我使用Java和BouncyCastle进行了此操作,并得到了我想要的。

这是我的代码。 我尝试使用几乎所有的Base64解码器打开类似的内容...

MIIHmwYJKoZIhvcNAQcCoIIHjDCCB4gCAQExCzAJBgUrDgMCGgUAMIIBrQYJKoZI
hvcNAQc ... Lots More stuff
... +8L5ad45D/7ZGJWafaSw==

进入...

0\202\233   *\367\367
\240\202\2140\202\21010 +

这是代码...

    string PKCS7String(starting_point);

    string PEM_PKCS7_HEADER("-----BEGIN PKCS7-----\n");
    string PEM_PKCS7_FOOTER("\n-----END PKCS7-----");

    string::size_type pos = 0;
    while ( (pos = PKCS7String.find(PEM_PKCS7_HEADER, pos)) != string::npos ) {
        PKCS7String.replace( pos, PEM_PKCS7_HEADER.length(), "" );
        pos++;
    }

    pos = 0;
    while ( (pos = PKCS7String.find(PEM_PKCS7_FOOTER, pos)) != string::npos ) {
        PKCS7String.replace( pos, PEM_PKCS7_FOOTER.length(), "" );
        pos++;
    }
    //Take your pick of decoders, they all do the same thing. Here's just the most recent
    auto_ptr< uint8_t > decoded = decode(PKCS7String);
    uint8_t* array = decoded.get();
    cout << array << endl;

有什么想法吗?

PEM文件只是DER文件的Base64编码版本,带有-----BEGIN PKCS7----------END PKCS7-----页眉和页脚行。
因此,不能完全确定在对Base64进行解码后您希望看到什么...

作为测试只是:

  1. 将证书打包为PKCS#7 PEM格式: $ openssl crl2pkcs7 -nocrl -out outfile.pem.p7b -certfile server.crt -outform pem

  2. 以PKCS#7 DER格式打包相同的证书: $ openssl crl2pkcs7 -nocrl -out outfile.der.p7b -certfile server.crt -outform der

  3. Base64使用您选择的解码器对PEM文件( outfile.pem.p7b )的主体进行解码,并将二进制输出与DER文件( outfile.der.p7b )进行比较。

现在,恐怕这可能是您要的,但不是您想要的...

<openssl/pkcs7.h> i2d_PKCS7_fp()i2d_PKCS7_bio()将以DER格式分别将PKCS7结构写到文件流或BIO。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM