Python RSA公钥大小

Python RSA公钥大小,python,cryptography,rsa,Python,Cryptography,Rsa,我需要在Python中使用RSA加密和解密的帮助。 我尝试使用RSA 2048生成公钥和私钥,然后将公钥作为十六进制发送到目标。但是,我遇到了一个问题,生成的公钥大小大于2048位。我使用了下面的脚本。我可以知道为什么密钥大小大于2048位吗 import Crypto from Crypto.PublicKey import RSA key = RSA.generate(2048) binPrivKey = key.exportKey('DER') binPubKey = key.publ

我需要在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'))

如果要导出密钥以供其他地方使用,您可能会发现以PEM格式导出密钥更容易,如下所示:

>>> print key.n
22958437811749378126735904957386766172644032831528249830706401935201456098524775
93935742531467773637499977046456570312080938678104306767641814358663672099815985
37166257748568890906635464134344070390567919827141645499361303936386291407244786
88192939984906393278409502460458733268776367836168349094440408475953441252058796
28391483565417017898863634275114447933217938009351306832376849011143622553495660
63424041991601059614183085270921567421339154500925080655811214971889251644612159
17495238196068931081086234165571014450595993262432428425126883651547622718096951
337250550253777137307186332200705951701212904813212411391
打印(key.publickey().exportKey('PEM')) -----开始公钥----- MiibijanbgKQHKIG9W0BaqefaaoCaq8AmiibcGkCaqeat2O9Ny7P9CVxZecu4KY tieqYGAkOFrvuRnZpf3VP4VK0XMFSXM8/i5c0Q3Ml44If/zqVo/cXAO85YqV8ZtJ YRtK9wcEr5epTX6iahxqgObgjFAbIRd6+we6znxBy+OG0JfEGn/GSBoq9g8mcr2e HhKflp3B57X3+QN1EBIYDFTHWXY4HUZXH64LJIA5S0YYYZLGYJCC6R/Q59/CsyKP K5LdcRp+CUrHfqwimiFUEZ+knob1klayy4UKX9CI1anwzusrmtbH+11Cfwgnnk 5RpqDvFNB30qsuD0elE+9zLOrq0jGicEoPtYAC3Z7phoODoR5vHbJ0R38qGItLMl /维达卡布 -----结束公钥----- DER格式包含相同的数据,但采用二进制格式,这可能会降低可移植性

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

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

>>> print key.n
22958437811749378126735904957386766172644032831528249830706401935201456098524775
93935742531467773637499977046456570312080938678104306767641814358663672099815985
37166257748568890906635464134344070390567919827141645499361303936386291407244786
88192939984906393278409502460458733268776367836168349094440408475953441252058796
28391483565417017898863634275114447933217938009351306832376849011143622553495660
63424041991601059614183085270921567421339154500925080655811214971889251644612159
17495238196068931081086234165571014450595993262432428425126883651547622718096951
337250550253777137307186332200705951701212904813212411391
是的,这是一个2048位的值:

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

RSA公钥由两部分组成:模和公钥指数。模数的大小决定键的大小。因此,如果给定给密钥对生成器的大小是2048位。公共指数可以是任何值,也可以高达2048位。然而,它通常很小。现在,它通常被设置为65537,即六位小数的
010001
。它是一个称为费马第五素数的特殊数字,通常用“F4”(基于零的指数化)表示

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


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

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


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


注:

  • 2048位的RSA密钥对仅提供112位的密钥强度(即112位的安全性),而AES-128提供约127位的安全性。通常,您应该尝试使用3072位密钥
  • 私钥通常包含中国剩余定理的参数和2048位模和2048位私钥指数之上的公共指数,因此它会更大

密钥不仅仅是一个特定大小的数字(尽管rsa公钥可能是一个数字,但我忘记了确切的细节)。然后它有标题和其他东西。此外,十六进制编码比二进制编码大。两个密钥(公共和私有)都包含两个数字,模块N和指数d或e。