1

Bouncy Castle 附带的 RSA 实现只允许加密单个数据块。RSA 算法不适合流式传输数据,不应以这种方式使用。在这种情况下,您应该使用随机生成的密钥和对称密码对数据进行加密,之后您应该使用 RSA 对随机生成的密钥进行加密,然后将加密的数据和加密的随机密钥发送到另一端他们可以反转该过程(即使用他们的 RSA 私钥解密随机密钥,然后解密数据)。

我不能使用使用对称密钥的解决方法。那么,除了 Bouncy Castle 之外,还有其他 RSA 实现吗?

4

4 回答 4

5

这种限制不仅仅是 Bouncy Castle 随机发明的东西,使用对称密钥也不是“解决方法”:这是正确的做法。

RSA 算法本质上不适合加密大量数据。如果你真的真的真的真的很想在大量数据上使用它,那么你可以将你的数据分成足够小的块,并加密每个块。但这不是标准做法,您可能会遇到您没有想到的安全问题,而 AES 等分组密码具有处理您可能遇到的问题的标准方法(查看分组模式- 本质上存在安全问题例如,使用相同的密钥多次加密相同的数据,并且块模式是处理这种情况的内置方式)。

我真的会坚持使用对称加密进行流式传输并使用 RSA 加密对称密钥(基本上没有其他内容)的标准做法。

于 2010-05-24T19:32:53.383 回答
1

是的,JDK 自带一个,但它对你没有任何好处。通常,这是使用 RSA 时完成加密的方式。您生成一个随机对称密钥并用它加密您的数据。您使用 RSA 加密对称密钥并传输。

如果您只想使用 RSA 加密并省略对称部分,您可以这样做(使用 BC 或不使用),但请注意,加密或解密将非常缓慢,并且比典型的替代方案占用更多空间。

于 2010-05-24T19:30:54.777 回答
1

所有 RSA 实现都会有类似的警告。这就是 RSA 算法的本质。

如上所述使用对称密钥不是“解决方法”。这是正确的。” 如果有可能应用更好的加密技术,那将是值得追求的。

于 2010-05-24T19:31:52.373 回答
1

您可以为每个数据“块”调用一次 RSA。不要这样做。

  • RSA 不是分组密码。它接受 [0,p×q] 范围内的输入,而不是 [0,2 n -1]。在显而易见的实现中,每个输出块至少比输入块大 1 位,这并不理想。
  • RSA 是乘法的。用 RSA e () 表示用密钥 e 进行 RSA 加密,
    • RSA e (0) = 0
    • RSA e (1) = 1
    • RSA e (a*b) = RSA e (a) × RSA e (a)

为什么不能生成对称密钥?

于 2010-05-24T19:38:19.897 回答