我要做的是生成随机的 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 结构中,类似于 RSA_generate_key 存储它们的方式。
我的代码如下所示。我将密钥与一个小标题一起存储在内存中,告诉我密钥有多大。私钥紧跟在标头之后,公钥存储在紧跟私钥之后。
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 结构,它似乎不起作用。我能够很好地加密,但我的解密失败。这可能是由于公共密钥是最后检索的密钥并且用于加密的事实。如果第二次调用覆盖了我的 RSA 结构的地址,我最终会得到一个只有公钥的 RSA 结构。
无论如何,如果有人能告诉我如何将公钥和私钥都放入同一个 RSA 结构中,那就太好了!