【问题标题】:How to read RSA public and private keys into single RSA struct?如何将 RSA 公钥和私钥读入单个 RSA 结构?
【发布时间】:2012-12-22 14:55:42
【问题描述】:

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

【问题讨论】:

    标签: c++ c openssl rsa public-key-encryption


    【解决方案1】:

    与 RSA 私钥相比,公钥额外只包含公共指数。因此,只需将其从公钥结构复制到私钥结构中,一切就可以正常工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2012-01-28
      相关资源
      最近更新 更多