2014-08-27 142 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()或类似的函数。