可以使用 RSA 加密的数据量有什么限制?
通常,建议使用 RSA 来加密对称密钥,然后使用该密钥来加密“有效负载”。
对于可以使用 RSA 加密的数据量的实际(或理论)限制是什么(我使用的是 2048 位 RSA 密钥大小)。
特别是,我想知道使用(不同的)RSA公钥加密RSA公钥(256字节)是否安全?我正在使用Java中的Bouncy Castle加密库。
通常,建议使用 RSA 来加密对称密钥,然后使用该密钥来加密“有效负载”。
对于可以使用 RSA 加密的数据量的实际(或理论)限制是什么(我使用的是 2048 位 RSA 密钥大小)。
特别是,我想知道使用(不同的)RSA公钥加密RSA公钥(256字节)是否安全?我正在使用Java中的Bouncy Castle加密库。
对于 n 位 RSA 密钥,直接加密(使用 PKCS#1“旧式”填充)适用于最多字节的任意二进制消息。换句话说,对于 1024 位 RSA 密钥(128 字节),最多 117 个字节。floor(n/8) - 11
使用OAEP(PKCS#1“新式”填充),这有点少。OAEP使用具有输出长度h位的哈希函数;这意味着 大小限制为 。对于使用 SHA-256 作为哈希函数 (h = 256) 的 1024 位 RSA 密钥,这意味着二进制消息最多为 62 个字节。floor(n/8) - 2*ceil(h/8) - 2
使用另一个RSA密钥加密RSA密钥没有问题(使用RSA加密任何字节序列都没有问题,无论这些字节代表什么),但是,当然,“外部”RSA密钥必须更大:使用旧式填充,要加密256字节的消息,您将需要一个模数至少为2136位的RSA密钥。
混合模式(您使用随机对称密钥加密数据并使用RSA加密该对称密钥)仍然被推荐作为一般情况,如果仅仅是因为它们没有任何实际的大小限制,并且因为它们使用另一个密钥交换算法(例如Diffie-Hellman)替换RSA部分变得更加容易。
限制或多或少是无限的,但正如你自己所说,这不是非对称加密应该使用的方式。用于实现非对称加密系统的方法比用于对称加密的方法慢几个数量级(例如AES,TrippleDES,PRESENT,...)。那你为什么要这样做呢?使用非对称加密建立密钥(使用安全密钥建立协议,不要发明),然后使用已建立的密钥使用对称算法加密数据。
在相关的说明中:为什么要用另一个公钥加密?顾名思义,它应该是公开的。如果攻击者拿到手,他就无法对它做任何事情。
[编辑]您绝对应该检查的一件事是您使用的函数是否实现了填充(最好是RSAES-OAEP)。否则,您的公钥每次都会加密到相同的输出,因此监视您的通信的对手仍然可以知道是您在传输某些东西,即使他看不到您正在传输哪个公钥。