使用RSA可以加密的数据量有多少限制?

通常,建议使用RSA加密对称密钥,然后将其用于加密“有效负载”。

对于可以使用RSA加密的数据量的实际(或理论)限制是什么(我使用的是2048位RSA密钥大小)。

特别是,我想知道使用(不同的)RSA公钥加密RSA公钥(256字节)是否安全? 我在Java中使用Bouncy Castle加密库。

对于n位RSA密钥,直接加密(使用PKCS#1 “旧式”填充)适用于高达楼层(n / 8)-11字节的任意二进制消息。 换句话说,对于1024位RSA密钥(128字节),最多117个字节。 使用OAEP(PKCS#1“新式”填充),这有点少:OAEP使用输出长度为h位的散列函数; 这意味着楼层的大小限制(n / 8)-2 * ceil(h / 8)-2 :仍然是1024位RSA密钥,SHA-256作为散列函数( h = 256 ),这意味着二进制消息最多60个字节。

使用另一个RSA密钥加密RSA密钥没有问题(使用RSA加密任何字节序列没有问题,无论这些字节代表什么),但是,当然,“外部”RSA密钥必须更大:使用旧式填充,要加密256字节的消息,您将需要一个模数至少为2136位的RSA密钥。

混合模式(使用RSA加密随机对称密钥,然后使用该密钥进行对称加密)仍被推荐为一般情况,只是因为它们没有任何实际的大小限制,并且还因为它们使更容易更换RSA部分与另一个密钥交换算法(例如Diffie-Hellman)。

(理论)限制是无限的。

对于实际限制,您必须使用您的特定硬件/软件实施进行测试,并与您对速度的要求进行比较。


关于安全问题,我会说是的。 您的身份(您想要隐藏)与您的收件人的私钥安全一样安全。

限制或多或少是无限的,但正如你自己所说,这不是应该如何使用非对称加密。 用于实现非对称加密系统的方法比对称加密系统的方法慢几个数量级(例如AES,TrippleDES,PRESENT,……)。 那你为什么要那样做? 使用非对称加密来建立密钥(使用安全密钥建立协议,不要发明密钥),然后使用已建立的密钥使用对称算法加密数据。

在相关的说明:为什么你要用另一个公钥加密? 顾名思义,这应该是公开的。 如果攻击者抓住它,攻击者就无法做任何事情。

[编辑]你应该检查的一件事是你使用的function是否实现了填充(最好是RSAES-OAEP)。 否则,您的公钥每次都会加密到相同的输出,因此,即使他无法看到您正在传输的是哪个公钥,对您的通信的间谍仍然可以了解到您正在传输某些内容。

在你提出这个问题三年之后,我偶然发现了你的post,因为我只需要实现类似的东西。 在这种情况下,您需要的是一种加密模式,用于将消息分解为密钥大小的块,因为消息长度最大。 您还需要块填充来填充消息的每个块(选择消息填充,通常应用于DES,3DES,AES等)。 不容易,但可能。 您需要确保每个填充块小于允许的最大大小。 对于块填充,您可以使用例如OAEP或PKCS_V1_5。 作为加密模式,您可以使用ECB(不安全但有效)或更详细的内容。 (参见维基百科和加密模式)。

如果你有一个很好的加密API,你应该能够设置加密模式和阻止/消息填充,只需将消息抛出它。