簡體   English   中英

使用OpenSSL 1.1生成EC密鑰時僅使用1個EVP_PKEY

[英]Using only 1 EVP_PKEY while generating EC keys using OpenSSL 1.1

在我看到的所有示例中,使用EVP高級函數通過OpenSSL使用橢圓曲線生成密鑰,需要兩個EVP_PKEY_CTXEVP_PKEY (總共4個)變量:

  1. 一個鍵/上下文對,用於參數生成
  2. 實際密鑰本身的一對密鑰/上下文對(使用參數初始化)。

是否可以將兩者合並為僅一個鍵/上下文對? 據我了解,從我所看到的示例中,邏輯是這樣的:

  1. 使用所需的任何曲線算法ID創建一個EVP_PKEY_CONTEXT
  2. 使用EVP_PKEY_paramgen_init()初始化上下文。
  3. 在參數上下文中調用所需的任何參數設置函數(例如EVP_PKEY_CTX_set_ec_paramgen_curve_nid )。
  4. 使用EVP_PKEY_paramgen生成/完成參數,從而為您提供EVP_PKEY
  5. 為實際密鑰創建一個EVP_PKEY_CTX ,並使用上一步中的參數EVP_PKEY初始化。
  6. 使用EVP_PKEY_keygen_init()初始化密鑰。
  7. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM