我要做的是生成随机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结构中,那就太棒了!
答案 0 :(得分:0)
与RSA私钥相比,公钥另外只包含公共指数。所以只需将其从公钥复制到私钥结构,一切都应该有效。