【问题标题】:RSA public key size pythonRSA公钥大小python
【发布时间】:2023-03-17 15:51:01
【问题描述】:

我需要在 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 公钥可能是单个数字,但我忘记了确切的细节)。然后它有标题和东西。此外,十六进制编码大于二进制编码。
  • 两个密钥(公钥和私钥)都包含两个数字,模块 N 和指数 d 或 e。

标签: python cryptography rsa


【解决方案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

【讨论】:

    【解决方案2】:

    RSA 公钥由两部分组成:模数和公共指数。模数的大小决定了密钥的大小。因此,如果这是给密钥对生成器的大小,则它是 2048 位。公共指数可以是任何值,并且可以是最多2048位。但是,它通常很小。现在它通常设置为值 65537,即十六进制的010001。它是一个特殊的数,称为费马的第五素数,通常用“F4”(从零开始的索引)表示。

    公钥结构应包含这两个组件。 encoded 密钥大小通常大于任何非对称原语(例如 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
    

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


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


    注意事项:

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

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 2020-04-07
      • 1970-01-01
      • 2017-02-06
      • 2020-12-19
      • 2011-12-10
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      相关资源
      最近更新 更多