【问题标题】:Extract public key from EVP_PKEY keypair?从 EVP_PKEY 密钥对中提取公钥?
【发布时间】:2014-10-21 02:42:15
【问题描述】:

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

我可以相对轻松地创建密钥pair

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

我能够找到RSA-specific functions,但使用高级EVP_*() API 找不到。

帮助?

【问题讨论】:

  • 您的问题是什么? “仅提取公钥组件以供在公共方面使用” 有点模棱两可。您想知道如何从PKEY 获取公钥吗?或者您想知道如何保存公钥?还是别的什么?
  • @jww:我认为这个问题很明确......我想获得一个包含公钥组件的EVP_PKEY数据结构。
  • “我想获得一个仅包含公钥组件的 EVP_PKEY 数据结构” - 这需要一些工作,因为 OpenSSL 没有为 @ 987654329@ gear (可以做,但需要一些工作)。通常你会写出一个 DER 或 PEM 编码的密钥(公钥或私钥)。你有没有看过pem(3) gear 中的功能。使用*_bio 函数,您可以写入文件或内存。例如,看一下<openssl src>/apps/rsautl.c(针对 RSA 案例)。
  • @jwiw:会的,感谢您的指点。 (这是我第一次近距离接触 OpenSSL,所以我完全有可能在这里找错树了。)
  • 本质上,你必须往返EVP_PKEY。在旅途中,您必须获取原始格式的密钥(如RSA*DSA*)并将其从私有转换为公共。然后将其发送回EVP_PKEY。但就像我说的,如果您只需要一个 DER 或 PEM 编码的密钥来分发,请使用 pem(3) 中的内容。

标签: c openssl libcrypto


【解决方案1】:

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

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>

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多