3

我要做的是生成随机的 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 结构中,那就太好了!

4

1 回答 1

0

与 RSA 私钥相比,公钥额外只包含公共指数。所以只需将它从公钥复制到私钥结构,一切都应该工作。

于 2013-01-08T19:23:21.220 回答