2011-01-05 34 views
0

我剛寫完一些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; 

有什麼想法?

回答

0

i2d_PKCS7_fp()i2d_PKCS7_bio()<openssl/pkcs7.h>將分別寫出DER格式的PKCS7結構到文件流或BIO。

3

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. Base64使用解碼器解碼PEM文件的主體(outfile.pem.p7b)o ˚F您選擇&比較的DER文件的二進制輸出(outfile.der.p7b

現在,恐怕這可能是你問什麼,但你想要的不是...