OpenSSL

密碼學和 SSL/TLS 工具包

EVP_KEYMGMT-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) <未簽署整數>
"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) <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 金鑰參數

僅當設定 "FIPS 模組測試的 RSA 金鑰產生參數" 中指定的值時,才能擷取下列中間值。不應在生產環境中存取這些值。

"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 KeyPair 驗證檢查。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 License 2.0(「授權」)授權。您只能在遵守授權的規定下使用此檔案。您可以在原始程式碼散佈中的 LICENSE 檔案中取得副本,或前往 https://www.openssl.org/source/license.html 取得副本。