RSA 公钥和私钥长度

信息安全 加密 密码学 RSA
2021-08-11 19:57:35

我在理解 RSA 公钥及其私钥对的大小时遇到​​问题。

我看到了 RSA 算法的不同密钥大小(例如 512、1024、...),但这是公钥的长度还是私钥的长度,还是两者的长度相等?

我已经搜索过了,但是:

  1. 这个问题中,提到了 RSA 算法的私钥和公钥具有相同的长度。但:
  2. 这个问题中提到它们有不同的长度!

两个答案都被接受。它们的长度相等还是不相等?

此外,我生成 RSA 密钥对的 Java Card 小程序总是返回相等长度的公钥和私钥。生成RSA密钥对的在线工具有不同长度的输出!

例子:

在线工具1

在此处输入图像描述

在线工具2

在此处输入图像描述

2个回答

> 我看到 RSA 算法的不同密钥大小(例如 512、1024、... [位])但是,这是公钥的长度还是私钥的长度,或者两者的长度相等?

它是用于计算 RSA 密钥对的模数的长度。公钥由模数和公共指数组成,而私钥由模数和私有指数组成。

> 但是生成RSA密钥对的在线工具有不同长度的输出!

第一张图片显示了 PEM 格式的公钥和私钥,以 Base64 编码(不是密钥的模数和指数,而是显示在第二张图片中)。

RSA私钥的内容如下:

-----BEGIN RSA PRIVATE KEY-----
RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}
-----END RSA PRIVATE KEY-----

而 RSA 公钥仅包含以下数据:

-----BEGIN RSA PUBLIC KEY-----
RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}
-----END RSA PUBLIC KEY-----

这解释了为什么私钥块更大。

现在,为什么私钥包含这么多数据?毕竟,只需要模数n和私有指数d所有其他内容都预先计算并包含在私钥块中的原因是为了加快使用中文剩余算法的解密速度。(感谢@dbernard 在评论中指出这一点。)

请注意,非 RSA 公钥的更标准格式是

-----BEGIN PUBLIC KEY-----
PublicKeyInfo ::= SEQUENCE {
  algorithm       AlgorithmIdentifier,
  PublicKey       BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}
-----END PUBLIC KEY-----

更多信息在这里

顺便说一句,由于您刚刚发布了私钥的屏幕截图,我强烈希望它只是用于测试:)

一个 RSA 公钥包含几个(大)整数值,一个 RSA 私钥也包含一些整数值。尽管内容不同,但 RSA 公钥和相应的 RSA 私钥共享一个共同的数学结构,特别是,它们都包含一个称为模数的特定值。给定对的公钥和私钥必须在相同的模值上工作,否则 RSA 不起作用(它用公钥加密的内容必须用相应的私钥解密)。

传统上,RSA 密钥的“长度”是模数的长度(以位为单位)。当说 RSA 密钥的长度为“2048”时,这实际上意味着模值介于 2 2047和 2 2048 之间由于给定对的公钥和私钥共享相同的模数,因此根据定义,它们也具有相同的“长度”。

但是,除了模数之外,公钥和私钥都包含其他值。因此,当您将公钥或私钥编码为字节(以便它们可以存储在文件中)时,您需要的不仅仅是模数的字节。理论上,一个 2048 位模数可以恰好适合 256 个字节(因为 256*8 = 2048),但您需要更多字节来编码其他值。

此外,RSA 公钥包含模数和另一个称为“公共指数”的值,该值通常很短。因此,公钥将需要相对较少的额外字节进行编码;模数是公钥中最大的一块。私钥不是这样,它包括模数和公共指数(如公钥),还包括“私人指数”(一个与模数大致一样大的数字)和其他五个大小大约为一半的值的模数。结果是编码的私钥预计比相应的编码公钥大约大五倍(以字节计)。

这些只是编码方面的考虑;“RSA 密钥长度”(如“2048 位密钥”)与模数的数值有关,而不是与因子的整个用具的编码长度以及减少的指数和 CRT 系数有关。