12

多くの場合、ユーザーはPEMでエンコードされたRSA秘密鍵を持っています。Crypto ++をロードするには、これらのキーがDER形式である必要があります。私は、次のようなopensslを使用して、事前にPEMファイルをDERに手動で変換するように人々に求めてきました。

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

それはうまくいきますが、それを行う方法を理解していない人もいれば、したくない人もいます。そこで、プログラム内でPEMファイルをDERファイルに自動的に変換したいと思います。

PEMから「-----BEGINCERTIFICATE-----」と「-----ENDCERTIFICATE-----」をストライピングするのと同じくらい簡単ですか、それとも他の変換も必要ですか?これらのマーカーの間では、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へのシステムコールを避け、Crypto ++で完全に変換を実行して、ユーザーがいずれかの形式と「正常に機能する」ものを提供できるようにしたいと思います。アドバイスありがとうございます。

4

3 に答える 3

9

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

于 2012-03-22T11:12:00.907 に答える
3

私はこれが古い質問であることを知っていますが、他の人はこれが役に立つかもしれません。マーカーを取り除くと、「内側の」キーマテリアルが残ります。http://www.cryptopp.com/wiki/Keys_and_Formats#BER_and_DER_Encodingによると、BERDecodePrivateKeyこれをロードするために使用できます。したがって、マーカーが削除されたopensslキーをロードするには、次のようにします。

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);
}
于 2013-01-24T02:29:18.333 に答える