2012-08-09 17 views
5

私のプロジェクトで公開鍵/秘密鍵を使用してデータを暗号化/復号化しています。OpenSSLを使用して公開鍵/秘密鍵をメモリから読み取る

私は公開鍵( "public.pem")をサーバ上でホストしています。

「public.pemは」次のようになります。

-----BEGIN PUBLIC KEY----- 
..... 
..... 
-----END PUBLIC KEY----- 

私は、この公開鍵をダウンロードし、クライアント側を書き、それをディスクに保存し、そのファイルへのファイルディスクリプタでのOpenSSLのPEM_read_RSA_PUBKEY()を呼び出します。 この操作は効果的です。その結果、暗号化の準備が整ったRSAオブジェクトが生成されます。

公開鍵を毎回ディスクに書き込まないようにしたいと思います。

バッファをディスクに保存せずに同じ操作を行うにはどうすればよいですか? 私はPEM_read_bio_RSAPublicKey()という関数に気づきましたが、BIO構造体の使用がわかりません。私は正しい道にいますか?

本当の質問は、私がファイルディスクリプタからではなく、メモリから直接公開鍵/秘密鍵をRSAオブジェクトに読み込む方法です。

答えて

14

あなたは正しい方向にあります。 BIO_new_mem_buf()経由でBIOバッファーを使用してメモリに既にPEMキーをラップする必要があります。言い換えれば、何かのように:

BIO *bufio; 
RSA *rsa 

bufio = BIO_new_mem_buf((void*)pem_key_buffer, pem_key_buffer_len); 
PEM_read_bio_RSAPublicKey(bufio, &rsa, 0, NULL); 

同じアプローチは、(PEM_read_bio_RSAPrivateKey経由)RSA秘密鍵に有効であるが、その場合には、あなたが最も確かにパスフレーズに対応するために必要があります。詳細についてはman pageをご確認ください。

+1

私は今すぐそのオプションを試しました。暗号化は正常で、復号化は機能しませんでした。公開鍵は以下のようにする必要がありますか、クライアントに送信する際に「BEGIN PUBLIC KEY」を削除する必要がありますか? ----- BEGIN PUBLIC KEY ----- ..... ..... ----- END公開鍵----- – user1144031

+0

マニュアルページのリンクが壊れています。誰かが更新されたリンクを持っていますか? – digawp

2

SquareRootOfTwentyThreeの方法は私のためには機能しません。ここに私の解決策があります。

BIO* bio = BIO_new(BIO_s_mem()); 
int len = BIO_write(bio, pem_key_buffer, pem_key_buffer_len); 
EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); 
RSA* rsa = EVP_PKEY_get1_RSA(evp_key); 
関連する問題