RSA
名稱
EVP_PKEY-RSA、EVP_KEYMGMT-RSA、RSA - EVP_PKEY RSA 金鑰類型和演算法支援
說明
RSA 金鑰類型在 OpenSSL 的預設和 FIPS 提供者中實作。該實作支援基本 RSA 金鑰,包含模數 n、公開指數 e、私密指數 d,以及一組用於 CRT 計算的質數因子、指數和係數,其中前幾個稱為 p 和 q、dP 和 dQ,以及 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 取得一份副本。