2013-01-08 76 views
3

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

回答

0

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