开放SSL

密码学和 SSL/TLS 工具包

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

这 4 个字段通常是随机生成的。素数因子“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 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)

Copyright 2020-2024 The OpenSSL Project Authors. 保留所有权利。

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