2013-01-08 79 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私鑰相比,公鑰加入只包含公開指數。所以只需將它從公鑰複製到私鑰結構,並且一切都應該工作。