12

我有一些我想使用 RSA_PKCS_V21 加密的明文(使用 PolarSSL 库)。问题是我需要在执行算法之前知道密文的大小(用于动态内存分配目的)。我知道 RSA 密钥大小和明文长度。
我也想知道输入明文长度的限制。
任何想法?

4

1 回答 1

15

只需检查RSA PKCS#1 v2.1 标准,第 7.2 章

RSAES-PKCS1-V1_5-ENCRYPT ((n, e), M)

输入:

  • (n, e) 接收者的 RSA 公钥(k 表示模数 n 的八位字节长度)
  • M要加密的消息,长度为mLen的八位字节串,其中mLen <= k - 11

所以输入取决于密钥大小。k是那个密钥大小,但以八位字节为单位。因此,对于 1024 位密钥,您有 1024 / 8 - 11 = 117 个字节作为最大纯文本。


请注意,上面是带有 PKCS#1 v1.5 填充的 RSA 的最大大小。对于较新的 OAEP 填充,可以在第 7.1 章中找到以下内容:

RSAES-OAEP-加密((n,e),M,L)

...

输入:

  • (n, e) 接收者的 RSA 公钥(k 表示 RSA 模数 n 的八位字节长度)
  • M要加密的消息,长度为mLen的八位字节串,其中mLen <= k - 2hLen - 2
  • l 与消息关联的可选标签;如果未提供 L,则 L 的默认值为空字符串

其中 hLen 是用于掩码生成函数的哈希函数的输出大小。如果使用默认的 SHA-1 哈希函数,则消息的最大大小为 k - 42(因为 SHA-1 的输出大小为 20 字节,并且 2 * 20 + 2 = 42)。


通常加密随机生成的密钥而不是消息。然后使用该密钥对消息进行加密。这允许几乎无限长的消息,并且对称加密(例如 CBC 模式中的 AES)比非对称加密快得多。这种组合称为混合加密


带有任何填充的 RSA 加密或签名生成的输出大小与以字节为单位的模数大小相同(当然向上舍入),因此对于 1024 位密钥,您期望 1024 / 8 = 128 个八位字节 / 字节。

请注意,计算大小的输出数组可能包含设置为零的前导字节;这应该被认为是正常的。

于 2012-07-31T23:45:32.607 回答