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