我想要做的是生成隨機的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結構,那太棒了!