RSA公钥大小python

2024-06-02 04:44:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助在Python中使用RSA加密和解密。 我尝试使用rsa2048生成一个公钥和一个私钥,然后将公钥作为十六进制发送到目标。但是,我遇到了一个问题,生成的公钥大小大于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'))

Tags: keyfromimport脚本目标密钥cryptorsa
2条回答

如果您想将密钥导出到其他地方使用,您可能会发现以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,则可以按如下方式提取:

^{pr2}$

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

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

公钥由两部分组成:模和公共指数。模数的大小决定键的大小。因此,如果给密钥对生成器的大小是2048位。公共指数可以是任意值,也可以是2048位。然而,它通常很小。现在它通常被设置为65537值,在十六进制中是010001。它是一个特殊的数,叫做费马的第四素数,通常用“F4”表示。在

公钥结构应该包含这两个组件。对于任何非对称原语(如RSA),编码的密钥大小通常大于密钥大小。除此之外,is可能包含开销(用于标识模数和指数的位置)和有关密钥本身的信息(例如,指示它确实是RSA公钥的OID)。在


要了解更多信息,可以查看PKCS#1和X.509证书规范。后者指定了一个名为SubjectPublicKeyInfo的结构,它是PEM编码的in the answer of squeamish ossifrage。你可以在线解析它here。在

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) 229584378117493781267359049573867661726440328315282498307064019352014…
            INTEGER 65537

这里第一个数是模,第二个是公指数。在


所以简言之,密钥大小、编码密钥大小和密钥强度之间存在差异。在


注意事项:

  • 2048位的RSA密钥对仅提供大约112位的安全性,而AES-128则提供大约127位的安全性。一般来说,您应该尝试使用3072位密钥。在
  • 私钥通常在2048位模和2048位私有指数的基础上包含中国剩余定理的参数和公共指数,因此它会更大。在

相关问题 更多 >