私がやろうとしているのは、ランダムな RSA キーを生成し、プログラムが終了する前にそれらを保存することです。この部分は、RSA_generate_key、PEM_write_bio_RSAPrivateKey、PEM_write_bio_RSA_PUBKEY を使用して問題なく動作しています。RSA_generate_key によって返された RSA 構造を使用して検索するだけで暗号化/復号化することもできます。
ただし、プログラムが再起動したときに問題が発生し、以前に保存したキーを読み戻したいと考えています。PEM_read_bio_RSAPrivateKey と PEM_read_bio_RSA_PUBKEY を使用してキーを取得できますが、RSA_generate_key によって格納される方法と同様に、キーを同じ RSA 構造に格納する必要があります。
私のコードを以下に示します。キーの大きさを示す小さなヘッダーとともに、キーをメモリに保存しています。秘密鍵はヘッダーの直後から始まり、公開鍵は秘密鍵の直後に格納されます。
privateKey = (uint8_t *) ( buffer + rsaStruct->hdrSize );
publicKey = (uint8_t *) ( privateKey + rsaStruct->privateKeyLength );
bioPrivate = BIO_new_mem_buf( (void *) privateKey, rsaStruct->privateKeyLength );
bioPublic = BIO_new_mem_buf( (void *) publicKey, rsaStruct->publicKeyLength );
bioPrivate = BIO_new_mem_buf( (void *) privateKey, rsaStruct->privateKeyLength + rsaStruct->publicKeyLength );
if( bioPrivate == NULL || bioPublic == NULL ) {
fprintf( stderr, "%s: BIO_new_mem_buf failed!\n", __FUNCTION__ );
return ECE_RSA_ERROR_BIO_CREATION_FAILED;
}
PEM_read_bio_RSAPrivateKey( bioPrivate, &keyPair, NULL, NULL );
PEM_read_bio_RSA_PUBKEY( bioPublic, &keyPair, NULL, NULL );
BIO_free( bioPrivate );
BIO_free( bioPublic );
同じ RSA 構造で送信しようとすると、うまくいかないようです。問題なく暗号化できますが、復号化に失敗します。これは、公開鍵が最後に取得された鍵であり、暗号化に使用されたことが原因である可能性があります。2 番目の呼び出しで RSA 構造体のアドレスが上書きされると、公開鍵しか持たない RSA 構造体になってしまいます。
とにかく、誰かが公開鍵と秘密鍵の両方を同じ RSA 構造に入れる方法を教えてくれたら、それは素晴らしいことです!