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 参数

除了所有密钥类型都应支持的通用参数外(参见 "Common parameters" in 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_KEYMGMT_SELECT_PRIVATE_KEY,则此选项将被忽略。此选项要求至少提供 OSSL_PARAM_RSA_FACTOR1、OSSL_PARAM_RSA_FACTOR2 和 OSSL_PARAM_RSA_N。

用于 FIPS 模块测试的 RSA 密钥生成参数

在生成 RSA 密钥时,以下额外的密钥生成参数仅可用于算法测试目的。请勿使用这些参数为生产环境生成 RSA 密钥。

"xp" (OSSL_PKEY_PARAM_RSA_TEST_XP) <无符号整数>
"xq" (OSSL_PKEY_PARAM_RSA_TEST_XQ) <无符号整数>

这两个字段通常是随机生成的,用于生成 "p" 和 "q"。

"xp1" (OSSL_PKEY_PARAM_RSA_TEST_XP1) <无符号整数>
"xp2" (OSSL_PKEY_PARAM_RSA_TEST_XP2) <无符号整数>
"xq1" (OSSL_PKEY_PARAM_RSA_TEST_XQ1) <无符号整数>
"xq2" (OSSL_PKEY_PARAM_RSA_TEST_XQ2) <无符号整数>

这 4 个字段通常是随机生成的。素数因子 "p1"、"p2"、"q1" 和 "q2" 由这些值确定。

用于 FIPS 模块测试的 RSA 密钥参数

只有在设置 "RSA key generation parameters for FIPS module testing" 中指定的值时,才能检索以下中间值。这些值不应在生产环境中访问。

"p1" (OSSL_PKEY_PARAM_RSA_TEST_P1) <无符号整数>
"p2" (OSSL_PKEY_PARAM_RSA_TEST_P2) <无符号整数>
"q1" (OSSL_PKEY_PARAM_RSA_TEST_Q1) <无符号整数>
"q2" (OSSL_PKEY_PARAM_RSA_TEST_Q2) <无符号整数>

辅助可能素数。

RSA 密钥验证

对于 RSA 密钥,EVP_PKEY_param_check(3)EVP_PKEY_param_check_quick(3) 都无条件地返回 1。

对于 RSA 密钥,EVP_PKEY_public_check(3) 在使用 OpenSSL FIPS 提供程序时符合 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 Validation check。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 中获取许可证副本。