【发布时间】: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)中的内容。