Python中的RSA公钥大小

3

我需要帮助使用Python进行RSA加密和解密。

我尝试使用RSA 2048生成公钥和私钥,然后将公钥以十六进制形式发送到目的地。但是,我遇到了一个问题,生成的公钥大小大于2048位。我使用了以下脚本。我可以知道为什么键的大小大于2048位吗?

import Crypto
from Crypto.PublicKey import RSA

key = RSA.generate(2048)

binPrivKey = key.exportKey('DER')
binPubKey = key.publickey().exportKey('DER')

print(binPubKey.encode('hex'))

密钥不仅仅是一个特定大小的单个数字(尽管 RSA 公钥可能是一个单独的数字,我忘记了确切的细节)。它还有头和其他内容。此外,十六进制编码比二进制编码更大。 - Kenny Ostrom
公钥和私钥都包含两个数字,模数 N 和指数 d 或 e。 - Klaus D.
2个回答

4

如果您想将密钥导出到其他地方使用,建议按以下方式以PEM格式导出密钥:

>>> print(key.publickey().exportKey('PEM'))
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtd2o9NY7P9CvXzECu4Ky
tieqYGAkOFrvuRnZpf3VP4VK0XMFSXM8/i5c0Q3Ml44If/zqVo/cXAO85YqV8ZtJ
YRtK9wcEr5epTX6iahxqgObgjFAbIRd6+we6znxBy+OG0JfEGn/GSBoq9g8mcr2e
HhKflp3B57X3+Qn1EbIYDFThWxy4HUZXh64LJiA5s0yeYzlGyjcC6R/Q59/CsyKP
K5LdcRp+CUrHfqwimiFUEZ+KNOob1klAyY4UKX9CI1AnWwZuSrmtbH+11Cfwgnnk
5RpqDvFNB30qsuD0elE+9zLOrq0jGicEoPtYAC3Z7phoODoR5vHbJ0R38qGItLMl
/wIDAQAB
-----END PUBLIC KEY-----

DER格式包含相同的数据,但以二进制形式表示,可能不太便携。

密钥长度不是2048位,因为公钥不仅包含模数n,还包括加密指数e

如果您只想要2048位模数n,则可以按以下方式提取:

>>> print(key.n)
22958437811749378126735904957386766172644032831528249830706401935201456098524775
93935742531467773637499977046456570312080938678104306767641814358663672099815985
37166257748568890906635464134344070390567919827141645499361303936386291407244786
88192939984906393278409502460458733268776367836168349094440408475953441252058796
28391483565417017898863634275114447933217938009351306832376849011143622553495660
63424041991601059614183085270921567421339154500925080655811214971889251644612159
17495238196068931081086234165571014450595993262432428425126883651547622718096951
337250550253777137307186332200705951701212904813212411391

是的,这是一个2048位的值:

>>> print(key.n.bit_length())
2048

2
一个RSA公钥由两个组件组成:模数和公共指数。模数的大小决定了密钥的大小。因此,如果密钥对生成器给出这个大小,则它为2048位。公共指数可以是任何值,也可以高达2048位。但通常很小。现在通常将其设置为值65537,这是十六进制中的010001。它是一个称为费马第五质数的特殊数字,通常用“F4”(从零开始计数)表示。
公钥结构应包含这两个组件。编码后的密钥大小通常比RSA等任何非对称原语的密钥大小要大。除此之外,它可能包含开销(以确定模数和指数的位置)以及有关密钥本身的信息(例如OID,表示它确实是RSA公钥)。

要了解更多信息,您可以查看PKCS#1和X.509证书规范。后者指定了一种称为SubjectPublicKeyInfo的结构,它是PEM编码的{{link1:在squeamish ossifrage的答案中}}。您可以在{{link2:此处}}在线解析它。
SEQUENCE (2 elem)
    SEQUENCE (2 elem)
        OBJECT IDENTIFIER1.2.840.113549.1.1.1 rsaEncryption (PKCS #1)
        NULL
    BIT STRING (1 elem)
        SEQUENCE (2 elem)
            INTEGER (2048 bit) 229584378117493781267359049573867661726440328315282498307064019352014INTEGER 65537

这里的第一个数字是模数,第二个数字是公共指数。
简述来说,密钥大小、编码后的密钥大小和密钥强度是有区别的。
注:
  • 2048位的RSA密钥对仅提供112位的密钥强度(即112位安全性),而AES-128提供约127位的安全性。通常应尝试使用3072位密钥。
  • 私钥通常包含中国剩余定理的参数和公共指数,以及2048位模数和2048位私有指数,因此它将更大。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接