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

Java 可以使用RSA加密的数据量限制是多少?,java,encryption,cryptography,Java,Encryption,Cryptography,通常,建议使用RSA加密对称密钥,然后使用对称密钥加密“有效负载” 可以使用RSA加密的数据量的实际(或理论)限制是多少(我使用的是2048位RSA密钥大小) 特别是,我想知道使用(不同的)RSA公钥加密RSA公钥(256字节)是否安全?我正在使用Java中的Bouncy Castle加密库。理论上的极限是无限的 对于实际限制,您必须使用特定的硬件/软件实现进行测试,并与您的速度要求进行比较 关于安全问题,我同意。您的身份(您希望隐藏的身份)与收件人私钥的安全性一样安全。限制或多或少是无限的,

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

可以使用RSA加密的数据量的实际(或理论)限制是多少(我使用的是2048位RSA密钥大小)

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

理论上的极限是无限的

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



关于安全问题,我同意。您的身份(您希望隐藏的身份)与收件人私钥的安全性一样安全。

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

请注意:为什么要用另一个公钥加密?顾名思义,它应该是公开的。如果攻击者抓住它,他什么也做不了

[编辑]您应该明确检查的一件事是,您使用的函数是否实现了填充(最好是RSAES-OAEP)。否则,您的公钥每次都会加密到相同的输出,因此窥探您通信的对手仍然可以知道是您在传输内容,即使他看不到您正在传输的公钥。

对于n位RSA密钥,直接加密(使用“旧式”填充)适用于任意二进制消息,最大为楼层(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密钥


(您使用随机对称密钥加密数据,并使用RSA加密该对称密钥)尽管如此,还是建议将其作为一般情况使用,因为它们没有任何实际的大小限制,并且更容易用另一种密钥交换算法(例如Diffie Hellman)替换RSA部分.

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


如果你有一个好的加密API,你应该能够设置加密模式和块/消息填充,然后直接抛出消息。

我正在使用内置的Java加密库。我将更详细地更新我的问题。为什么要加密RSA公钥?这里没有什么可隐藏的。我的RSA公钥显示了我的身份,除了收件人之外,我不想这样做。我能想到的唯一情况是,如果你想将公钥发送给其他人,他一定要得到正确的公钥。因此,您可以发送未加密的公钥和使用接收方公钥加密的公钥,这样只有接收方才能解密该公钥,并将其与发送的未加密公钥进行比较。@sanity:是的,也是这样。有两种情况。从技术上讲,RSA公钥只不过是两个整数(一个非常大的模和一个指数)。你可以省去与它相关的一切,仍然加密私钥持有者可以解密的东西。好吧,我知道这要慢得多,但这将是一个罕见的操作,我只加密256字节。我想知道这是否值得担心。对于你的问题:我想加密它,因为我的公钥显示了我的身份,我不想这样做,除非是对收件人。@我明白,在这种情况下,建立密钥的开销可能不值得。所以我想你也可以用RSA加密。谢谢-我想你对此很有信心吧?(也就是说,我应该费心测试一下吗?@santy好吧,测试不会有什么坏处,对吧:)?另请参阅我答案中的编辑,以了解更多信息。@thomas pornin我不知道RSA的这些限制。我现在无法访问我的加密参考资料,你能告诉我你在哪里找到这些信息吗?@Darhuuk:这些限制很明显来自于填充系统的工作方式;PKCS#1(第18页用于OAEP,第23页用于老式填充)中非常清楚地说明了它们。floor(1024/8)-2*ceil(256/8)-2==62不是60吗?为什么要用RSA加密长消息?标准选择是混合加密-使用AES加密消息,并使用RSA加密AES密钥。不能使用典型的分组密码