[英]How to convert CNG key to OpenSSL EVP_PKEY (and vice versa)?
[英]Using only 1 EVP_PKEY while generating EC keys using OpenSSL 1.1
在我看到的所有示例中,使用EVP高級函數通過OpenSSL使用橢圓曲線生成密鑰,需要兩個EVP_PKEY_CTX
和EVP_PKEY
(總共4個)變量:
是否可以將兩者合並為僅一個鍵/上下文對? 據我了解,從我所看到的示例中,邏輯是這樣的:
EVP_PKEY_CONTEXT
。 EVP_PKEY_paramgen_init()
初始化上下文。 EVP_PKEY_CTX_set_ec_paramgen_curve_nid
)。 EVP_PKEY_paramgen
生成/完成參數,從而為您提供EVP_PKEY
。 EVP_PKEY_CTX
,並使用上一步中的參數EVP_PKEY
初始化。 EVP_PKEY_keygen_init()
初始化密鑰。 EVP_PKEY_keygen()
生成/確定密鑰。 有什么方法可以簡化這個過程? 例如,我可以只初始化一個鍵,調用該鍵上的paramgen函數,然后調用EVP_PKEY_keygen()
嗎? 根據我的經驗,這就是如何與RSA密鑰生成一起工作的(您實際上只執行了上面的最后兩個步驟,中間發生了步驟3)。
文檔指出了這一點,這似乎表明第二個上下文/密鑰對是不必要的:
在調用EVP_PKEY_keygen_init()或EVP_PKEY_paramgen_init()算法之后,可以執行特定的控制操作以設置該操作的任何適當參數。
如果使用相同參數執行多個操作,則可以在同一上下文中多次調用函數EVP_PKEY_keygen()和EVP_PKEY_paramgen()。
也許我誤會了,但似乎是在說您可以在調用EVP_PKEY_keygen_init()
之后調用參數設置函數,而不是使用paramgen
函數。
單獨的參數生成階段實際上是針對像Diffie-Hellman這樣的算法所必需的。 對於EC,您幾乎總是使用“標准”參數集(即眾所周知的曲線)。 因此,OpenSSL允許您對此進行快捷操作,並且僅在您已經知道要使用哪些參數的情況下才進行密鑰生成。 如果是EVP_PKEY_CTX_set_ec_paramgen_curve_nid()
宏,則可以通過參數生成或鍵生成選項將其明確記錄為可用:
https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_CTX_set_ec_paramgen_curve_nid.html
EVP_PKEY_CTX_set_ec_paramgen_curve_nid()將EC參數生成的EC曲線設置為B。對於EC參數生成,必須調用此宏,否則會發生錯誤,因為沒有默認曲線。 生成EC鍵時,也可以調用此函數來顯式設置曲線。
因此,使用P-256曲線(NID_X9_62_prime256v1)生成密鑰的代碼可能如下所示:
#include <openssl/evp.h>
#include <openssl/ec.h>
int main(void) {
EVP_PKEY_CTX *ctx;
EVP_PKEY *pkey = NULL;
int ret = 1;
ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
if (ctx == NULL)
goto err;
if (EVP_PKEY_keygen_init(ctx) <= 0)
goto err;
if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, NID_X9_62_prime256v1) <= 0)
goto err;
/* Generate key */
if (EVP_PKEY_keygen(ctx, &pkey) <= 0)
goto err;
printf("Success!\n");
ret = 0;
err:
EVP_PKEY_CTX_free(ctx);
return ret;
}
這僅需要單個EVP_PKEY
和單個EVP_PKEY_CTX
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.