通常建议使用RSA加密对称密钥,然后将其用于加密“有效负载”。
使用RSA加密的数据量的实际(或理论)限制是什么(我使用的是2048位RSA密钥大小)。
特别是,我想知道使用(不同的)RSA公钥加密RSA公钥(256字节)是否安全?我正在使用Java中的Bouncy Castle加密库。
答案 0 :(得分:16)
对于 n 位RSA密钥,直接加密(PKCS#1“旧式”填充)适用于 floor(n / 8)之间的任意二进制消息-11 个字节。换句话说,对于1024位RSA密钥(128字节),最多117个字节。使用OAEP(PKCS#1“新式”填充),这有点少:OAEP使用输出长度 h 位的散列函数;这意味着 floor(n / 8)-2 * ceil(h / 8)-2 的大小限制:仍然是1024位RSA密钥,SHA-256作为散列函数( h = 256 ),这意味着最多60个字节的二进制消息。
用另一个RSA密钥加密RSA密钥没有问题(使用RSA加密任何字节序列没有问题,无论这些字节代表什么),当然,“外部“RSA密钥必须更大:使用旧式填充,加密256字节的消息,您将需要一个模数至少为2136位的RSA密钥。
Hybrid modes(您使用随机对称密钥加密数据并使用RSA加密该对称密钥)仍被推荐为一般情况,只是因为它们没有任何实际大小限制,并且还因为它们使用另一种密钥交换算法(例如Diffie-Hellman)更容易替换RSA部分。
答案 1 :(得分:2)
(理论)限制是无限的。
对于实际限制,您必须使用您的特定硬件/软件实施进行测试,并与您对速度的要求进行比较。
关于安全问题,我会说是的。您的身份(您想要隐藏)与您的收件人的私钥安全一样安全。
答案 2 :(得分:2)
限制或多或少是无限的,但正如你自己所说,这不是应该如何使用非对称加密。用于实现非对称加密系统的方法比对称加密系统(例如AES,TrippleDES,PRESENT,......)慢几个数量级。那你为什么要那样做?使用非对称加密来建立密钥(使用安全密钥建立协议,不要发明密钥),然后使用已建立的密钥使用对称算法加密数据。
在相关的说明中:为什么要用另一个公钥加密?顾名思义,它应该是公开的。如果攻击者抓住它,攻击者就无法做任何事情。
[编辑] 您应该检查的一件事是您使用的功能是否实现了填充(最好是RSAES-OAEP)。否则,您的公钥每次都会加密到相同的输出,因此,即使他无法查看您正在传输的是哪个公钥,但是通过您的通信监视的对手仍然可以了解到您正在传输某些内容。 / p>
答案 3 :(得分:0)
在你问这个问题三年后,我偶然发现了你的帖子,因为我只需要实现类似的东西。在这种情况下,您需要的是一种加密模式,用于将消息分成大小调整的块,因为消息长度最大。您还需要块填充来填充消息的每个块(选择消息填充,通常应用于DES,3DES,AES)。不容易,但可能。您需要确保每个填充块小于允许的最大大小。对于块填充,您可以使用例如OAEP或PKCS_V1_5。作为加密模式,您可以使用ECB(不安全但有效)或更详细的内容。 (参见维基百科和加密模式)。
如果您有一个好的加密API,您应该能够设置加密模式和阻止/消息填充,只需将消息抛出即可。