EVP_PKEY-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) <無符號整數>
- "rsa-exponent9" (OSSL_PKEY_PARAM_RSA_EXPONENT9) <無符號整數>
- "rsa-exponent10" (OSSL_PKEY_PARAM_RSA_EXPONENT10) <無符號整數>
-
RSA CRT(中國剩餘定理)指數。指數在 RFC8017 中稱為「dP」、「dQ」和「d_i」。最多支援八個額外的「d_i」指數。
- "rsa-coefficient1" (OSSL_PKEY_PARAM_RSA_COEFFICIENT1) <無符號整數>
- "rsa-coefficient2" (OSSL_PKEY_PARAM_RSA_COEFFICIENT2) <無符號整數>
- "rsa-coefficient3" (OSSL_PKEY_PARAM_RSA_COEFFICIENT3) <無符號整數>
- "rsa-coefficient4" (OSSL_PKEY_PARAM_RSA_COEFFICIENT4) <無符號整數>
- "rsa-coefficient5" (OSSL_PKEY_PARAM_RSA_COEFFICIENT5) <無符號整數>
- "rsa-coefficient6" (OSSL_PKEY_PARAM_RSA_COEFFICIENT6) <無符號整數>
- "rsa-coefficient7" (OSSL_PKEY_PARAM_RSA_COEFFICIENT7) <無符號整數>
- "rsa-coefficient8" (OSSL_PKEY_PARAM_RSA_COEFFICIENT8) <無符號整數>
- "rsa-coefficient9" (OSSL_PKEY_PARAM_RSA_COEFFICIENT9) <無符號整數>
-
RSA CRT(中國剩餘定理)係數。係數稱為「qInv」和「t_i」。最多支援八個額外的「t_i」指數。
RSA 金鑰產生參數
產生 RSA 金鑰時,可以使用下列金鑰產生參數。
- "bits" (OSSL_PKEY_PARAM_RSA_BITS) <無符號整數>
-
值應為 RSA 密碼系統的密碼長度(以位元為單位)。
- "primes" (OSSL_PKEY_PARAM_RSA_PRIMES) <無符號整數>
-
值應為所產生 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) <無符號整數>
-
指出如果未提供參數清單中未傳遞的遺失參數,應在未提供時衍生。設定非零值將導致在未提供時衍生所有必要的指數和係數。設定此選項需要至少提供 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) <無符號整數>
- "xq" (OSSL_PKEY_PARAM_RSA_TEST_XQ) <unsigned integer>
-
這兩個欄位通常會隨機產生,並用於產生「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 金鑰,EVP_PKEY_pairwise_check(3) 會符合 OpenSSL FIPS 提供者的 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)
版權
版權所有 2020-2024 The OpenSSL Project Authors。保留所有權利。
在 Apache 授權 2.0(「授權」)下授權。您不得使用此檔案,除非符合授權。您可以在原始程式碼散佈中的 LICENSE 檔案或 https://www.openssl.org/source/license.html 取得副本。