2014-08-27 825 views
2

我在我的應用程序中使用OpenSSL的高層次函數EVP_*()實現加密/解密方案,因此我可以輕鬆切換實際使用的算法,而無需更改API調用。從EVP_PKEY密鑰對提取公鑰?

我可以創建一個關鍵相對容易:

// dumbed down, no error checking for brevity 
EVP_PKEY * pkey; 
// can change EVP_PKEY_RSA to something else here 
EVP_PKEY_CTX * context = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); 
EVP_PKEY_keygen_init(ctx); 
// could set parameters here 
EVP_PKEY_keygen(context, &pkey); 
// ... 
EVP_PKEY_CTX_free(context); 

pkey現在持有的關鍵,即兩個祕密和公共密鑰。這對於祕密這邊的東西很好,但顯然我想提取只有公鑰部分用於公共事物。

我能找到RSA-specific functions,但沒有使用API​​的高級別EVP_*()

幫助?

+0

你的問題是什麼? *「只提取用於公共事物的公共密鑰組件」*是含糊不清的。你想知道如何從「PKEY」獲得公鑰嗎?或者你想知道如何保存公鑰?或者是其他東西? – jww 2014-08-27 14:15:15

+0

@jww:我認爲這個問題是毫不含糊的......我想獲得一個僅包含公鑰組件的EVP_PKEY數據結構。 – DevSolar 2014-08-27 14:26:57

+0

*「我想獲得一個僅包含公鑰組件的EVP_PKEY數據結構」* - 這需要一些工作,因爲OpenSSL沒有爲'EVP_ *'設備設置(可以完成,但它可以完成需要一些工作)。通常你寫出DER或PEM編碼密鑰(公共或私人)。你看過['pem(3)'](http://www.openssl.org/docs/crypto/pem.html)裝置中的函數嗎?使用'* _bio'函數,您可以寫入文件或內存。例如,查看'/apps/rsautl.c'(對於RSA情況)。 – jww 2014-08-27 15:00:00

回答

3

您可以使用以下方法分離公鑰和私鑰以供將來使用。

int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc, 
        unsigned char *kstr, int klen, 
        pem_password_cb *cb, void *u); 

int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc, 
        unsigned char *kstr, int klen, 
        pem_password_cb *cb, void *u); 
EVP_PKEY *PEM_read_bio_PUBKEY(BIO *bp, EVP_PKEY **x, 
        pem_password_cb *cb, void *u); 

EVP_PKEY *PEM_read_PUBKEY(FILE *fp, EVP_PKEY **x, 
        pem_password_cb *cb, void *u); 

int PEM_write_bio_PUBKEY(BIO *bp, EVP_PKEY *x); 
int PEM_write_PUBKEY(FILE *fp, EVP_PKEY *x); 

有關詳細信息,請參閱<openssl/pem.h>

1

這可能是,你應該使用i2d_PUBKEY_bio()或類似的函數。