2010-05-24 75 views
1

带有 的RSA实现仅限Bouncy Castle允许对单个数据块进行加密 。 RSA算法不适用于 流数据,不应该以这种方式使用 。在这样的情况下,你 应该使用加密数据的 随机产生的密钥和对称 密码,之后,你应该使用RSA, 加密 随机生成的密钥,然后发送加密数据和 加密的随机关键其他 结束,他们可以扭转过程 (即解密随机密钥使用 他们的RSA私钥,然后解密 的数据)。用于Java的RSA实现,替代BC

我无法使用使用对称密钥的解决方法。那么,RSA的其他实现是否比Bouncy Castle还要多?

+0

的目的是什么,你流的加密的数据? – laz 2010-05-24 19:41:47

回答

4

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

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

我真的只是坚持使用对称加密进行流式传输的标准做法,并使用RSA加密对称密钥(实际上没有其他)。

1

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

如果你只想用RSA进行加密而省略对称部分,你可以做到这一点(使用BC或不使用),但要警告的是,它将非常缓慢的加密或解密,占用很多空间典型的选择。

1

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

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

1

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

  • RSA不是分组密码。它接受[0,p × q]范围内的输入,而不是[0,2 n − 1]。在明显的实现中,每个输出块至少比输入块大1个比特,这不是理想的。
  • RSA乘法。使用RSA ()来表示RSA加密密钥和
    • RSA (0)= 0
    • RSA (1)= 1
    • RSA (一* b)= RSA和(a)和 × RSA的(a)

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

+0

因为我实现(是不是错了)的规范说来。 – 2010-05-26 19:03:40

+2

然后固定规范,因为它要么真正的“要求”(所以它的延展性),或如此令人难以置信的错误阙需要有人被枪杀。在你所描述的令人难以置信的方式使用RSA是不好的做法,** **就算你知道块加密模式和填充PKCS#N. – 2010-05-31 15:23:09