簡體   English   中英

RSA公鑰大小python

[英]RSA public key size python

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

RSA 公鑰由兩個部分組成:模數和公共指數。 模數的大小決定了密鑰的大小。 因此,如果這是提供給密鑰對生成器的大小,則為 2048 位。 公共指數可以是任何值,也可以高達 2048 位。 但是,它通常很小。 如今,它通常設置為值 65537,即十六進制的010001 它是一個特殊的數字,稱為費馬的第五個素數,通常用“F4”表示(基於零的索引)。

公鑰結構應該包含這兩個組件。 編碼的密鑰大小通常大於任何非對稱原語(如 RSA)的密鑰大小。 除此之外,它可能包含開銷(以識別模數和指數的位置)和有關密鑰本身的信息(例如,指示它確實是 RSA 公鑰的 OID)。


要了解更多信息,您可以查看 PKCS#1 和 X.509 證書規范。 后者指定了一個名為SubjectPublicKeyInfo的結構,它是在 ossifrage 的答案中編碼PEM。 你可以在這里在線解析它。

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 位的密鑰強度(即 112 位的安全性),而 AES-128 提供大約 127 位的安全性。 一般來說,您應該嘗試使用 3072 位密鑰。
  • 私鑰通常包含中國剩余定理的參數和2048位模數和2048位私有指數之上的公共指數,因此它會更大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM