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

时间:2011-01-05 01:45:00

标签: c++ openssl base64 pem pkcs#7

我刚刚写完了一些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;

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

PEM文件只是DER文件的Base64编码版本,-----BEGIN PKCS7-----&amp; -----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

  4. 进行比较

    现在,我担心这可能是你要求的,但不是你想要的......

答案 1 :(得分:0)

来自i2d_PKCS7_fp()

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