我刚刚完成了一些 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;
有什么想法吗?