从EVP_PKEY密钥对中提取公钥?

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

我能够找到特定于RSA的函数 ,但没有使用高级EVP_*() API。

救命?

您可以使用以下方法分隔公钥和私钥以供将来使用。

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

有关详细信息,请参阅

它可能是,你应该使用i2d_PUBKEY_bio()或类似的function。