我有一种情况,我需要使用OpenPGP加密某些文件。我正在使用Bouncy Castle来这样做。

据我了解,Bouncy Castle加密可以在Java中以两种方式使用:


我将Bouncy Castle添加为提供程序,并继续使用标准Java库。
我直接使用Bouncy Castle库中指定的类。


我想知道两种方法的优缺点,以及推荐哪种方法。

另外,如果我使用的是第二种方法,那么为什么我仍然必须将Bouncy Castle添加为安全提供程序。如果我不这样做,那么执行以下行时会出现“ No Such Provider”异常:

PGPEncryptedDataGenerator encGen =
            new PGPEncryptedDataGenerator(
            new JcePGPDataEncryptorBuilder(PGPEncryptedData.CAST5).setWithIntegrityPacket(withIntegrityCheck).setSecureRandom(
            new SecureRandom())
            .setProvider("BC"));

最佳答案

据我了解,Bouncy Castle加密可以在Java中以两种方式使用:
  
  
  我将Bouncy Castle添加为提供程序,并继续使用标准Java库。
  我直接使用Bouncy Castle库中指定的类。
  
  
  我想知道两种方法的优缺点,以及推荐哪种方法。


Java JCA是设计更好的文档,当然也是文档更好的API。它具有更好地定义的异常处理,以及最新的参数处理(ByteBuffer)。

此外,通过使用提供程序抽象,不仅可以使用基于软件的提供程序(例如Bouncy Castle)来增强它,还可以使用平台功能和硬件提供程序来增强它。因此,如果您根据JCA进行编程,则会获得更加灵活的运行时奖励。

另一方面,轻量级加密API是一种相对较低级别的API,以相对良好的结构化方式提供了更多功能。如果使用它,则基本上是选择Bouncy Castle作为唯一的功能提供者。 Bouncy Castle仅包含Java代码中的特定实现,这意味着您将不会获得(很多)硬件支持。

Bouncy Castle的轻量级API没有管辖区限制(例如128位AES密钥)。因此,如果您想解决这些限制,可以将其用于您自己的协议(如果您可以下载一个等效的库而不会出现问题,那么请不要让我首先了解这些限制的原因)。


  另外,如果我使用的是第二种方法,那么为什么我仍然必须将Bouncy Castle添加为安全提供程序。如果我不这样做,那么我会收到“没有这样的提供者”异常(...)?


充气城堡PGP功能实际上是建立在JCA之上的;就这么简单。如果不是,则无法使用Java密钥或其他(平台或硬件)加密功能。

许多其他软件组件也假定要使用JCA。您不能简单地将轻量级API插入现有协议实现中。

09-26 21:20