我正在使用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-specific functions,但没有使用高级EVP_*()
API。
帮助?
答案 0 :(得分:4)
您可以使用以下方法分隔公钥和私钥以供将来使用。
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 :(得分:1)
它可能是,你应该使用i2d_PUBKEY_bio()或类似的功能。