Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从EVP_PKEY密钥对中提取公钥?_C_Openssl_Libcrypto - Fatal编程技术网

C 从EVP_PKEY密钥对中提取公钥?

C 从EVP_PKEY密钥对中提取公钥?,c,openssl,libcrypto,C,Openssl,Libcrypto,我在我的应用程序中使用OpenSSL的高级EVP_*()函数实现加密/解密方案,因此我可以轻松地切换使用的实际算法,而无需更改API调用 我可以相对轻松地创建一个密钥对: // 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_P

我在我的应用程序中使用OpenSSL的高级
EVP_*()
函数实现加密/解密方案,因此我可以轻松地切换使用的实际算法,而无需更改API调用

我可以相对轻松地创建一个密钥对:

// 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
现在持有一对密钥,即秘密密钥和公钥。这对于事物的秘密方面来说很好,但显然我只想提取公钥组件,以便在事物的公共方面使用

我能够找到,但使用高级
EVP_*()
API什么也找不到


帮助?

可能是这样,您应该使用i2d\u PUBKEY\u bio()或类似函数。

您可以使用以下方法来分离公钥和私钥,以备将来使用

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);

有关详细信息,请参阅

您的问题是什么?“仅提取公钥组件用于事物的公共端”有点含糊不清。您想知道如何从
PKEY
获取公钥吗?或者您想知道如何保存公钥?还是别的什么?@jww:我觉得这个问题很明确。。。我想得到一个只包含公钥组件的
EVP_PKEY
数据结构。“我想得到一个只包含公钥组件的EVP_PKEY数据结构”-这需要一些工作,因为OpenSSL不是为
EVP_*
gear那样设置的(可以做到,但需要一些工作)。通常您会写出一个DER或PEM编码的密钥(公共或私有)。你看过齿轮的功能了吗。使用
*\u bio
函数,您可以写入文件或内存。例如,请看一看
/apps/rsautl.c
(适用于RSA案例)。@jwiw:可以,谢谢你的指点。(这是我第一次近距离接触OpenSSL,所以很可能我在这里找错了方向。)本质上,你必须往返于一个
EVP_PKEY
。在旅途中,您必须以其本机格式获取密钥(如
RSA*
DSA*
),并将其从私有转换为公共。然后将其发送回执行副总裁。但是就像我说的,如果您只需要一个DER或PEM编码的密钥就可以分发,请使用
PEM(3)
中的内容。