2012-03-22 8 views
12

多くの場合、ユーザはPEMでエンコードされたRSA秘密鍵を持ちます。 Crypto ++では、ロードするためにこれらのキーがDER形式である必要があります。正常に動作しますが、一部の人々はそれを行う方法を理解していないも、彼らがしたいですか暗号化されたPEMでエンコードされたプライベートRSA鍵をロードする

openssl pkcs8 -in in_file.pem -out out_file.der -topk8 -nocrypt -outform der 

:私は手動でこのようなOpenSSLを使用して、事前にDERするために彼らのPEMファイルを変換するために人々を求めてきました。だから私はPEMファイルを自動的にプログラム内のDERファイルに変換したいと思っています。

PEMから "----- BEGIN CERTIFICATE -----"と "----- END CERTIFICATE -----"をストライピングするのと同じくらい単純ですか、まあ?私はそれらのマーカーの間に、それがちょうどb64コード化されたDERであると言われてきました。ここでは、問題を示していますいくつかのコードがあります:

// load the private key 
CryptoPP::RSA::PrivateKey PK; 
CryptoPP::ByteQueue bytes; 

try 
{ 
    CryptoPP::FileSource File(rsa.c_str(), true, new CryptoPP::Base64Decoder()); 
    File.TransferTo(bytes); 
    bytes.MessageEnd(); 

    // This line Causes BERDecodeError when a PEM encoded file is used 
    PK.Load(bytes); 
} 

catch (CryptoPP::BERDecodeErr) 
{ 
    // Convert PEM to DER and try to load the key again 
} 

私は、システムは、OpenSSLに呼び出し、ユーザーは「ただ働き」形式と物事のいずれかを提供することができるよう++暗号で完全に変換を行うことを避けるためにしたいと思います。アドバイスありがとう。

+0

メモリ内デコーダを探しているのですか、オンディスクの方がいいですか? –

+0

@OrgnlDave - Crypto ++を使用しているすべての例がそうです。 – 01100110

+0

@ 01100110 - 現在、Crypto ++はアドオンとしてこのサポートを提供しています。 Crypto ++ wikiの[PEM Pack](http://www.cryptopp.com/wiki/PEM_Pack)を参照してください。 – jww

答えて

7

はい、Base64でエンコードされたDERストリームです。ただし、BEGINマーカーとENDマーカーの両方をストライピングするだけでなく、RSAキー形式の場合は、BEGINマーカーとエンコードされたデータの間に挿入されるフラグも削除する必要があります。残りの部分だけが正常にBase64でデコードされます。完全な証明書ファイルをデコーダに送り、修正する必要があるようです。

+0

私は答えを感謝します。 opensslへのstd ::システムコールで変換を行うことができます。それは正常に動作しますが、ハックです。私はPEMからDERへの変換をCrypto ++で完全にやりたいのですが。 – 01100110

+0

ようこそstackoverflowまたはLcount、+1その答えです。 –

+0

私はCrypto ++の専門家ではありませんが、ライブラリがPEMでエンコードされた証明書を直接読み込むことをサポートしていないようです。その機能を追加する必要があります。 'rsa'変数に直接std :: stringの機能を使ってbegin/endマーカーを取り除くか、同じ仕事をする' CryptoPP :: BufferedTransformation'を書きます。 – orLcount

2

これは古い質問ですが、他の人はこれが役立つかもしれません。一度マーカーを剥ぎ取ると、 '内部'のキーマテリアルが残されます。 http://www.cryptopp.com/wiki/Keys_and_Formats#BER_and_DER_Encodingによれば、これをロードするのにBERDecodePrivateKeyを使うことができます。だから、あなたは

bool LoadKey(RandomNumberGenerator& rng, const std::string& file, 
    RSA::PrivateKey& key) 
{ 
    ByteQueue q; 
    FileSource KeyFile(file.c_str(), true, new Base64Decoder); 
    KeyFile.TransferTo(q); 
    key.BERDecodePrivateKey(q,false,0); // last 2 params unused 
    return key.Validate(rng, 2); 
} 
1

ような何かを行うことができ取り除かそのマーカーを持っていたのopensslキーをロードするために...私はプログラム内で自動的にファイルをDERするPEMファイルを変換したいと思います。

2014年7月に、PEM PackがCrypto ++ライブラリ用に提供されました。 PEMパックは、暗号化された秘密鍵を含むPEMエンコードされたキーとパラメータを読み書きできるメッセージ暗号化の部分実装です。追加ファイルには、RSA、DSA、EC、ECDSAキー、およびDiffie-Hellmanパラメータのサポートが含まれています。

これはライブラリへのアドオンであり、適切なライブラリの一部ではありません。 ZIPをダウンロードし、5つのソースファイルをライブラリに追加します。次に、ライブラリをビルドします(Crypto ++は自動的にライブラリを選択します)。 ZIPには、5つの追加ソースファイル、OpenSSLを使用してテストキーを作成するスクリプト、キーの読み書きをテストするC++プログラム、OpenSSLを使用してCrypto ++によって書き込まれたキーを検証するスクリプトが含まれています。ここで

は、あなたがそれを使用する方法は次のとおりです。

CryptoPP::RSA::PrivateKey pk; 
CryptoPP::FileSource file("<rsa-key-file.pem>", true); 

CryptoPP::PEM_Load(file, pk); 

CryptoPP::AutoSeededRandomPool prng; 
bool = pk.Validate(prng, 3); 
if (! valid) 
    throw ... 

キーは暗号化されている場合は、ここにあなたがそれをロードする方法です。 PEM Packの再実装にOpenSSLのEVP_BytesToKey、鍵導出は動作します、あなたが相互運用できるよう:あなたが暗号++から直接キーを書き込むことができるように

CryptoPP::RSA::PrivateKey pk; 
CryptoPP::FileSource file("<rsa-key-file.pem>", true); 

std::string pass = "<super secret password>"; 
CryptoPP::PEM_Load(file, pk, pass.data(), pass.size()); 

CryptoPP::AutoSeededRandomPool prng; 
bool = pk.Validate(prng, 3); 
if (! valid) 
    throw ... 

PEM_Saveは、もあります。たとえば、次の(あなたが暗号化しようとするまたはキー)暗号化キーの

// Generate it or load it from somewhere 
CryptoPP::RSA::PrivateKey pk = ...; 
CryptoPP::FileSink file("<rsa-key-file.pem>", true); 

CryptoPP::PEM_Save(file, pk); 

そしてPEM_Save

// Generate it or load it from somewhere 
CryptoPP::RSA::PrivateKey pk = ...; 
CryptoPP::FileSink file("<rsa-key-file.pem>", true); 

std::string pass = "<super secret password>"; 
CryptoPP::PEM_Save(file, pk, "AES-128-CBC", pass.data(), pass.size()); 

PEM_Loadないを行い、カプセル化ヘッダ内にそのコードためのアルゴリズムを必要としています。 PEM_Saveにはデフォルトのアルゴリズムがないためアルゴリズムが必要です。

関連する問題