我剛寫完一些OpenSSL/PKCS7數字簽名代碼,現在有一個可用的PEM編碼的PKCS7文件。所以經過一番戰鬥之後,我需要將該PEM轉換爲DER格式。這比我希望的更加嚴格。PEM轉換(PKCS7)到DER - AKA Base64 C++問題
在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;
有什麼想法?