我需要在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'))
答案 0 :(得分:1)
如果要导出密钥以在其他地方使用,则可能会发现更容易以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
答案 1 :(得分:1)
公钥包含两个部分:模数和公钥。模数的大小决定密钥的大小。因此,如果这是提供给密钥对生成器的大小,则为2048位。公共指数 可以是任意值,也可以是最多2048位。但是,它通常很小。如今,通常将其设置为值65537,以十六进制表示010001
。这是一个特殊的数字,称为Fermat的第四素数,通常用“ F4”表示。
公钥结构应包含两个组件。 已编码密钥的大小通常大于任何非对称基元(例如RSA)的密钥大小。除此之外,它还可能包含开销(用于标识模数和指数的位置)以及有关密钥本身的信息(例如,表明它确实是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
第一个数字是模数,第二个是公共指数。
因此,简而言之,密钥大小,编码密钥大小和密钥强度之间存在差异。
注意: