gpt4 book ai didi

c++ - PEM 转换 (PKCS7) 到 DER - 又名 Base64 C++ 问题

转载 作者:行者123 更新时间:2023-11-28 01:08:52 87 4
gpt4 key购买 nike

我刚刚完成了一些 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 解码后您希望看到什么......

作为测试:

  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. 使用您选择的解码器对 PEM 文件 (outfile.pem.p7b) 的主体进行 Base64 解码,并将二进制输出与 DER 文件 (outfile.der) 进行比较.p7b)

现在,恐怕这可能是您要求的,但不是您想要的......

关于c++ - PEM 转换 (PKCS7) 到 DER - 又名 Base64 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4600149/

87 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com