2017-07-16 60 views
2

生成された公開鍵からrsaオブジェクトをロードしようとしています。私はPEM_write_bio_RSAPublicKeyを使って公開鍵文字列を生成しました。次に、PEM_read_bio_RSA_PUBKEYを使用して、公開鍵ストリングからrsaオブジェクトをロードしました。問題は、rsaオブジェクトがnullであることです。生成された文字列は、私が知る限り、大丈夫です。何か案は?公開鍵を読み込んで公開暗号化用のrsaオブジェクトを作成する

-----BEGIN RSA PUBLIC KEY----- 
MIIBCgKCAQEAxIReUspesPy6a4CPBjt/4Jt+H13q9MekMiutzNKdNO1uuwqcdqDX 
pKPeTKXyUH6oCyRdUxkk6IVXGlBlxtW7OsxaYWhpfl9z3CCERCEpFmzN++dvlK2v 
mckFL66e9q6Y+HwgyP1LJqrszeqlg2d29TCVKfD/UURVNmc/nPPjs9nO+IDhh7+P 
NTQ2OqGBq8ghwVL5ZZyW3yVO5OAbRB6pjKBe9+j4B2TGnD5JO9Nu0jlFANZOKFJu 
HDVE3XuTvOkuzL2i8Lwp4Myk42tbIgcCe4G58vKFddL651rWhg4hN3fRSx5YtDnQ 
r5cgfNBOAww58S8lwXgU8lvzvEoNV+WMgwIDAQAB 
-----END RSA PUBLIC KEY----- 

gccのtest_public_private_key.c -lcrypto -o私はPEM_read_RSA_PUBKEYで始まるSubjectPublicKeyInfo構造を、期待しているため、これは動作しませんでした理由があることを追加していいだろうと思った

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <openssl/rsa.h> 
#include <openssl/pem.h> 
#include <openssl/err.h> 

char* get_public_key() { 

     RSA* rsa = RSA_new(); 
     int kbits = 2048; 
     BIGNUM* bne = BN_new(); 
     BN_set_word(bne, RSA_F4); 

     int status = RSA_generate_key_ex(rsa, kbits, bne, NULL); 
     if(status == 0) { 
       fprintf(stderr, "rsa key generation failed\n"); 
     } 


     BIO *bio = BIO_new(BIO_s_mem()); 
     PEM_write_bio_RSAPublicKey(bio, rsa); 

     int length = BIO_pending(bio); 

     char* pem_key = malloc(length+1); 
     memset(pem_key, '\0', length+1); 

     BIO_read(bio, pem_key, length); 

     return pem_key; 

} 

int main(int argc, char* argv[]) { 

     char* public_key = get_public_key(); 

     printf("%s", public_key); 

     BIO* keybio = BIO_new_mem_buf(public_key, -1); 

     if (keybio == NULL) { 
       fprintf(stderr, "failed to create key BIO"); 
     } 

     printf("keybio: %p\n", keybio); 
     RSA* rsa = PEM_read_bio_RSA_PUBKEY(keybio, NULL, NULL, NULL); 
     printf("rsa result %p\n", rsa); 
     BIO_free(keybio); 

     free(public_key); 

     return 0; 
} 
+0

私は、 '' '' BIO_FLAGS_BASE64_NO_NL'''フラグがセットされた実例を見て​​きました。おそらく、このフラグを '' 'BIO_set_flags(bio、BIO_FLAGS_BASE64_NO_NL);で設定しようとします。 – Daniel

+0

@Daniel文字列を生成するライブラリ自身の関数であるRSA ....という単語が含まれているかどうかわかりません。私はGoogleの検索を通じてNLの例を見ましたが、そのオプションを使用すると、生成された文字列から新しい行を削除する必要がありません。 –

+0

私は改行を取り除いて、そして取り除かずにNO_NLオプションを試しましたが、それはまだ動作しませんでした。 –

答えて

1

テストBEGIN PUBLIC KEYであり、PEM_read_RSAPublicKeyRSAPublicKey構造を想定しており、これはBEGIN RSA PUBLIC KEYで始まります。
PEM_write_bio_RSAPublicKeyが生成され、後者は第2の関数であるPEM_read_RSAPublicKeyに対応します。

+0

'RSA_generate_key_ex'はメモリ内のフォームを作成します。 'PEM_read_ [bio_] RSAPublicKey'で読み込み可能なPKCS1フォームを作成する' PEM_write_ [bio_] RSAPublicKey'です。PEM_read_ [bio _] [RSA_] PUBKEY' –

+0

@ dave_thompson_085ああ、私の悪い。私の答えを編集しました、ありがとうございました。 – Daniel

関連する問題