OpenSSL

密码学和SSL/TLS工具包

EVP_PKEY-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) <无符号整数>
"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) <无符号整数>

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

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

以下中间值仅在“用于FIPS模块测试的RSA密钥生成参数”中指定的值设置时才能检索。在生产环境中不应访问这些值。

"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密钥,当使用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 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0(“许可证”)获得许可。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的LICENSE文件中或https://www.openssl.org/source/license.html获取副本。