M2Crypto中RSA消息长度的下限

时间:2012-08-31 22:44:59

标签: python encryption rsa m2crypto

我正在尝试使用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加密的模数),但我不明白为什么会有一个下限。有人可以解释这一点,还是指出我正确的方向来解决这个问题?

3 个答案:

答案 0 :(得分:1)

还有作为消息的下限,否则,RSA操作将是常规算术,而不是模块化算术。

m \equiv c^d mod(n)其中,c = m^e mod(n)n = pq

m^e > n必须是真的,对于给定的消息m,换句话说m需要足够大才能减少n,或者对手可以只需计算m = c^1/e并恢复消息,因为从未减少了n。因此,

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

每条消息m都需要

举个例子:

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

如果我们选择m = 3m ≤ n^1/e或大约m ≤ 3.803(为了满足上述等式)

c ≡ 3^3 mod (55)

但也是:

c = 3^3没有mod存在,那就是重点,mod 55从未做过任何事情。由于e = 3被告知公众,因此可以简单地计算27^1/3 = 3并了解该消息为m = 3

答案 1 :(得分:0)

(从评论中重复回答,只是为了“关闭”)

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

答案 2 :(得分:0)

不知怎的重复。见这里:RSA Encryption Problem [Size of payload data] 第二个答案解释了你的问题非常好。