[英]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进行解码后您希望看到什么...
作为测试只是:
将证书打包为PKCS#7 PEM格式: $ openssl crl2pkcs7 -nocrl -out outfile.pem.p7b -certfile server.crt -outform pem
以PKCS#7 DER格式打包相同的证书: $ openssl crl2pkcs7 -nocrl -out outfile.der.p7b -certfile server.crt -outform der
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.