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


有什么想法吗?

最佳答案

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

10-05 19:55