開啟SSL

密碼學和 SSL/TLS 工具包

RSA

名稱

EVP_PKEY-RSA、EVP_KEYMGMT-RSA、RSA - EVP_PKEY RSA 金鑰類型和演算法支援

說明

RSA 金鑰類型在 OpenSSL 的預設和 FIPS 提供者中實作。該實作支援基本 RSA 金鑰,包含模數 n、公開指數 e、私密指數 d,以及一組用於 CRT 計算的質數因子、指數和係數,其中前幾個稱為 pqdPdQ,以及 qInv

常見 RSA 參數

除了所有金鑰類型都應支援的常見參數(請參閱 provider-keymgmt(7) 中的「常見參數」)外,RSA 金鑰類型實作還支援下列內容。

"n" (OSSL_PKEY_PARAM_RSA_N) <無符號整數>

RSA 模數 "n" 值。

"e" (OSSL_PKEY_PARAM_RSA_E) <無符號整數>

RSA 公開指數 "e" 值。使用 EVP_PKEY_fromdata(3) 建立原始金鑰時,此值必須永遠設定。請注意,當執行解密作業時,此值會用於遮蔽目的,以防止時間攻擊。

"d" (OSSL_PKEY_PARAM_RSA_D) <無符號整數>

RSA 私密指數 "d" 值。

"rsa-factor1" (OSSL_PKEY_PARAM_RSA_FACTOR1) <無符號整數>
"rsa-factor2" (OSSL_PKEY_PARAM_RSA_FACTOR2) <無符號整數>
"rsa-factor3" (OSSL_PKEY_PARAM_RSA_FACTOR3) <無符號整數>
"rsa-factor4" (OSSL_PKEY_PARAM_RSA_FACTOR4) <無符號整數>
"rsa-factor5" (OSSL_PKEY_PARAM_RSA_FACTOR5) <無符號整數>
"rsa-factor6" (OSSL_PKEY_PARAM_RSA_FACTOR6) <無符號整數>
"rsa-factor7" (OSSL_PKEY_PARAM_RSA_FACTOR7) <無符號整數>
"rsa-factor8" (OSSL_PKEY_PARAM_RSA_FACTOR8) <無符號整數>
"rsa-factor9" (OSSL_PKEY_PARAM_RSA_FACTOR9) <無符號整數>
"rsa-factor10" (OSSL_PKEY_PARAM_RSA_FACTOR10) <無符號整數>

RSA 質數因子。這些因子在 RFC8017 中稱為 "p"、"q" 和 "r_i"。最多支援八個額外的 "r_i" 質數因子。

"rsa-exponent1" (OSSL_PKEY_PARAM_RSA_EXPONENT1) <無符號整數>
"rsa-exponent2" (OSSL_PKEY_PARAM_RSA_EXPONENT2) <無符號整數>
"rsa-exponent3" (OSSL_PKEY_PARAM_RSA_EXPONENT3) <無符號整數>
"rsa-exponent4" (OSSL_PKEY_PARAM_RSA_EXPONENT4) <無符號整數>
"rsa-exponent5" (OSSL_PKEY_PARAM_RSA_EXPONENT5) <無符號整數>
"rsa-exponent6" (OSSL_PKEY_PARAM_RSA_EXPONENT6) <無符號整數>
"rsa-exponent7" (OSSL_PKEY_PARAM_RSA_EXPONENT7) <無符號整數>
"rsa-exponent8" (OSSL_PKEY_PARAM_RSA_EXPONENT8) <unsigned integer>
"rsa-exponent9" (OSSL_PKEY_PARAM_RSA_EXPONENT9) <unsigned integer>
"rsa-exponent10" (OSSL_PKEY_PARAM_RSA_EXPONENT10) <unsigned integer>

RSA CRT (中國餘數定理) 指數。在 RFC8017 中,這些指數稱為「dP」、「dQ」和「d_i」。最多支援八個額外的「d_i」指數。

"rsa-coefficient1" (OSSL_PKEY_PARAM_RSA_COEFFICIENT1) <unsigned integer>
"rsa-coefficient2" (OSSL_PKEY_PARAM_RSA_COEFFICIENT2) <unsigned integer>
"rsa-coefficient3" (OSSL_PKEY_PARAM_RSA_COEFFICIENT3) <unsigned integer>
"rsa-coefficient4" (OSSL_PKEY_PARAM_RSA_COEFFICIENT4) <unsigned integer>
"rsa-coefficient5" (OSSL_PKEY_PARAM_RSA_COEFFICIENT5) <unsigned integer>
"rsa-coefficient6" (OSSL_PKEY_PARAM_RSA_COEFFICIENT6) <unsigned integer>
"rsa-coefficient7" (OSSL_PKEY_PARAM_RSA_COEFFICIENT7) <unsigned integer>
"rsa-coefficient8" (OSSL_PKEY_PARAM_RSA_COEFFICIENT8) <unsigned integer>
"rsa-coefficient9" (OSSL_PKEY_PARAM_RSA_COEFFICIENT9) <unsigned integer>

RSA CRT (中國餘數定理) 係數。這些係數稱為「qInv」和「t_i」。最多支援八個額外的「t_i」指數。

RSA 金鑰產生參數

產生 RSA 金鑰時,可以使用下列金鑰產生參數。

"bits" (OSSL_PKEY_PARAM_RSA_BITS) <unsigned integer>

這個值應該是 RSA 密碼系統的加密長度,以位元為單位。

"primes" (OSSL_PKEY_PARAM_RSA_PRIMES) <unsigned integer>

這個值應該是已產生 RSA 金鑰的質數數量。預設值為 2。不允許指定大於 10 的質數數量。此外,質數數量會受到所產生金鑰長度的限制,因此最大數量可能會更少。有些提供者可能只支援 2 的值。

"e" (OSSL_PKEY_PARAM_RSA_E) <無符號整數>

RSA 的「e」值。這個值可以是任何大於或等於 65537 的奇數。預設值為 65537。基於舊有原因,目前接受 3 的值,但已不建議使用。

"rsa-derive-from-pq" (OSSL_PKEY_PARAM_RSA_DERIVE_FROM_PQ) <unsigned integer>

表示如果未提供參數清單中遺失的參數,則應衍生這些參數。設定非零值會導致衍生所有需要的指數和係數(如果沒有提供的話)。設定這個選項需要至少提供 OSSL_PARAM_RSA_FACTOR1、OSSL_PARAM_RSA_FACTOR2 和 OSSL_PARAM_RSA_N。如果在選取參數中未設定 OSSL_KEYMGMT_SELECT_PRIVATE_KEY,則會忽略這個選項。

FIPS 模組測試的 RSA 金鑰產生參數

產生 RSA 金鑰時,僅能將下列額外的金鑰產生參數用於演算法測試用途。請勿使用這些參數來產生生產環境的 RSA 金鑰。

「xp」(OSSL_PKEY_PARAM_RSA_TEST_XP) <unsigned integer>
「xq」(OSSL_PKEY_PARAM_RSA_TEST_XQ) <unsigned integer>

這 2 個欄位通常是隨機產生的,用於產生「p」和「q」。

「xp1」(OSSL_PKEY_PARAM_RSA_TEST_XP1) <unsigned integer>
「xp2」(OSSL_PKEY_PARAM_RSA_TEST_XP2) <unsigned integer>
「xq1」(OSSL_PKEY_PARAM_RSA_TEST_XQ1) <unsigned integer>
「xq2」(OSSL_PKEY_PARAM_RSA_TEST_XQ2) <unsigned integer>

這 4 個欄位通常是隨機產生的。質數因子「p1」、「p2」、「q1」和「q2」是由這些值決定的。

FIPS 模組測試的 RSA 金鑰參數

只有在設定 「RSA 金鑰產生參數,用於 FIPS 模組測試」 中指定的參數時,才能擷取下列中間值。這些值不應該在生產環境中存取。

「p1」(OSSL_PKEY_PARAM_RSA_TEST_P1) <unsigned integer>
「p2」(OSSL_PKEY_PARAM_RSA_TEST_P2) <unsigned integer>
「q1」(OSSL_PKEY_PARAM_RSA_TEST_Q1) <unsigned integer>
「q2」(OSSL_PKEY_PARAM_RSA_TEST_Q2) <unsigned integer>

輔助可能質數。

RSA 金鑰驗證

對於 RSA 金鑰,EVP_PKEY_param_check(3)EVP_PKEY_param_check_quick(3) 在任何情況下都會傳回 1。

對於 RSA 金鑰,當使用 OpenSSL FIPS 提供者時,EVP_PKEY_public_check(3) 會符合 SP800-56Br1 的公開金鑰檢查。OpenSSL 預設提供者會執行類似的測試,但會放寬金鑰大小限制,以維持向後相容性。

對於 RSA 金鑰,EVP_PKEY_public_check_quick(3)EVP_PKEY_public_check(3) 相同。

對於 RSA 金鑰,EVP_PKEY_private_check(3) 符合 SP800-56Br1 的私有金鑰測試

對於 RSA 金鑰,對於 OpenSSL FIPS 提供者,EVP_PKEY_pairwise_check(3) 符合 SP800-56Br1 的金鑰對驗證檢查。OpenSSL 預設提供者允許測試多質數的有效性。

相符於

FIPS186-4

B.3.6 節,基於輔助可能質數的條件產生可能質數

RFC 8017,不含 RSA-PSS 和 RSA-OAEP

範例

可以透過呼叫取得 EVP_PKEY 內容

EVP_PKEY_CTX *pctx =
    EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL);

可以像這樣簡單地產生 RSA 金鑰

pkey = EVP_RSA_gen(4096);

或像這樣

EVP_PKEY *pkey = NULL;
EVP_PKEY_CTX *pctx =
    EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL);

EVP_PKEY_keygen_init(pctx);
EVP_PKEY_generate(pctx, &pkey);
EVP_PKEY_CTX_free(pctx);

可以透過金鑰產生參數產生 RSA 金鑰

unsigned int primes = 3;
unsigned int bits = 4096;
OSSL_PARAM params[3];
EVP_PKEY *pkey = NULL;
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL);

EVP_PKEY_keygen_init(pctx);

params[0] = OSSL_PARAM_construct_uint("bits", &bits);
params[1] = OSSL_PARAM_construct_uint("primes", &primes);
params[2] = OSSL_PARAM_construct_end();
EVP_PKEY_CTX_set_params(pctx, params);

EVP_PKEY_generate(pctx, &pkey);
EVP_PKEY_print_private(bio_out, pkey, 0, NULL);
EVP_PKEY_CTX_free(pctx);

另請參閱

EVP_RSA_gen(3)EVP_KEYMGMT(3)EVP_PKEY(3)provider-keymgmt(7)

Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved.

根據 Apache License 2.0(「授權」)授權。您只能根據授權使用此檔案。您可以在原始程式碼中的 LICENSE 檔案或 https://www.openssl.org/source/license.html 取得一份副本。