RSA 公钥和私钥长度
> 我看到 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 系数有关。