1

我正在尝试使用外部站点使用 Python M2Crypto 的 RSA 提供给我的公钥对消息进行编码。本质上,我正在做这样的事情:

from M2Crypto import RSA
import os
rsa = RSA.load_pub_key(os.path.join(BASE_PATH, 'external_site.pem'))
rsa_result = rsa.public_encrypt(message, 3).encode('base64')

如果我在加密时不使用填充,则会收到错误消息:

RSAError: data too small for key size

我理解为什么消息长度(RSA 加密的模数)有上限,但我不明白为什么会有下限。有人可以解释一下或者指出我正确的方向来解决这个问题吗?

4

2 回答 2

1

消息中必须有一个下限,否则,RSA 操作将是常规算术,而不是模算术。

m \equiv c^d mod(n)在哪里,c = m^e mod(n)n = pq

m^e > n需要为真,对于给定的消息米,换句话说,米需要足够大以减少n,否则对手可以简单地计算m = c^1/e并恢复消息,因为它从未减少过n。因此,

\sqrt[e]{n} > m > (n - 1)

需要对每条消息都是真实的米


举个例子:

让 我们不需要这个例子,因为失败发生在到达那个点之前e = 3,p = 5,q = 11n = 55d

如果我们选择我们的米 = 3,这样 m ≤ n^1/e或大致米≤3.803(为了不满足上述等式)

c ≡ 3^3 模 (55)

但是也:

c = 3^3没有 mod 存在,这就是重点,mod 55 从来没有做任何事情。由于e = 3被告知公众,人们可以简单地计算27^1/3 = 3并得知该消息是米 = 3.

于 2016-12-29T04:05:41.320 回答
0

(重复评论的答案,只是为了“关闭”)

您可能需要以某种方式告诉您的 API 使用 OAEP 填充。如果您使用填充,错误可能会消失。不填充消息长度可能需要等于模数长度。但是不使用填充有严重的安全问题,所以除非你真的知道你在做什么,否则不要这样做。

于 2012-09-01T16:41:55.143 回答