我想要做的是生成随机的RSA密钥,然后在我的程序终止前存储它们。这部分使用RSA_generate_key,PEM_write_bio_RSAPrivateKey和PEM_write_bio_RSA_PUBKEY工作得很好。我也可以使用RSA_generate_key返回的RSA结构进行加密/解密。如何将RSA公钥和私钥读取到单个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结构,那太棒了!