Java 使用BouncyCastle轻量级API的OpenPGP加密

Java 使用BouncyCastle轻量级API的OpenPGP加密,java,encryption,aes,bouncycastle,pgp,Java,Encryption,Aes,Bouncycastle,Pgp,我必须使用256位AES-CBC密钥加密某些内容。要遵循的加密协议是OpenPGP。由于密钥大小为256位,并且公钥/私钥也将为4096位,因此我必须使用轻量级API。我发现了几个问题,说明了如何使用256位AES-CBC密钥进行加密,但我不知道如何将其与PGP集成 最明显的方法是使用AES引擎对其进行加密,然后像在OpenPGP中那样使用公钥对结果进行加密。但是,这需要我生成初始化向量和AES密钥。这些是我更喜欢图书馆做的事情,因为在做这些事情的时候有很多事情会出错 下面是我用来加密的代码示例

我必须使用256位AES-CBC密钥加密某些内容。要遵循的加密协议是OpenPGP。由于密钥大小为256位,并且公钥/私钥也将为4096位,因此我必须使用轻量级API。我发现了几个问题,说明了如何使用256位AES-CBC密钥进行加密,但我不知道如何将其与PGP集成

最明显的方法是使用AES引擎对其进行加密,然后像在OpenPGP中那样使用公钥对结果进行加密。但是,这需要我生成初始化向量和AES密钥。这些是我更喜欢图书馆做的事情,因为在做这些事情的时候有很多事情会出错

下面是我用来加密的代码示例:

PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(new JcePGPDataEncryptorBuilder(PGPEncryptedData.AES_256).setWithIntegrityPacket(true).setSecureRandom(rand).setProvider("BC"));
    encGen.addMethod(new JcePublicKeyKeyEncryptionMethodGenerator(<PGPPublic Key object>));

    OutputStream encryptedOut = encGen.open(out, new byte[BUFFER_SIZE]);
pgpencryptedatagenerator encGen=new-pgpencryptedatagenerator(new-JcePGPDataEncryptorBuilder(PGPEncryptedData.aes256).setWithIntegrityPackage(true).setSecurerRandom(rand).setProvider(“BC”);
encGen.addMethod(新的jcePubliceKeyEncryptionMethodGenerator());
OutputStream encryptedOut=encGen.open(输出,新字节[缓冲区大小]);

通过查看open函数的代码,我确定输入流首先使用AES-CFB编码(库在内部处理我提到的初始化向量的所有问题),然后使用我提供的公钥。如何让它改用AES-CBC

您的问题主要归结为两部分——使用AES-256和切换到CBC操作模式。我无法帮助您在Bouncy Castle中使用AES-256,但可以提供有关操作模式的说明


不能将CBC与OpenPGP一起使用。OpenPGP规范只允许一个。如果你需要CBC,你必须选择另一个加密系统;如果将OpenPGP消息放在一起更重要,请坚持使用OpenPGP CFB模式。如果您在CBC模式下创建OpenPGP消息,则它们不会遵循OpenPGP的标准和其他实现(如PGP、“普通”BouncyCastle”和GnuPG)无法阅读邮件。

您的问题主要归结为两部分——使用AES-256和切换到CBC操作模式。我无法帮助您在Bouncy Castle中使用AES-256,但可以提供有关操作模式的说明


不能将CBC与OpenPGP一起使用。OpenPGP规范只允许使用。如果需要CBC,则必须选择另一种加密系统;如果将OpenPGP消息放在一起更重要,请坚持使用OpenPGP CFB模式。如果在CBC模式下创建OpenPGP消息,则它们不符合OpenPGP的标准和其他实现(如PGP、“正常”BouncyCastle和GnuPG)无法读取消息。

为什么密钥大小会迫使您使用轻量级API?据我所知,如果我们需要256位aes密钥大小,则需要无限强度权限策略文件。我的用例不允许这样做,因为它不是一个可移植的解决方案。好的,这是有道理的。无限强度确实需要修改对于JRE目录,这并不总是可行的。因此问题仍然是一样的。我如何使用自定义对称算法构建PGP加密文件?为什么密钥大小会迫使您使用轻量级API?据我所知,如果我们需要256位的aes密钥大小,则需要无限强度权限策略文件。我的用例就是这样不允许这样做,因为它不是一个可移植的解决方案。好吧,这是有道理的。无限强度确实需要摆弄JRE目录,这并不总是可行的。所以问题仍然是一样的。如何使用自定义对称算法构建PGP加密文件?谢谢你的回答。作为后续,如果我可以修改源代码在bouncy castle中使用CBC时,是否有任何安全漏洞值得我担心?我知道更改块模式在功能上等同于创建一个新的协议本身,测试其中的漏洞是一个非常广泛的话题。我只是想知道是否有人已经做过这样的事情,因为在我看来这是肯定的如果你对密码学不是很确定,也不能与科学界的同行讨论任何变化,那么在设计协议时,你应该考虑其他模式。密码学的历史(包括PGP的开始)很多人都在尝试做一些聪明的事情,但失败的很惨。如果你需要高级安全性,不要推出你自己的加密。如果你需要CBC,不要使用OpenPGP。不要编写加密代码,不要更改加密协议。无论如何,这远远超出了原始问题的范围,而且肯定会导致堆栈溢出。谢谢你的支持答案。作为后续,如果我可以修改bouncy castle中的源代码以使用CBC,是否有任何安全漏洞需要我担心?我知道更改块模式在功能上等同于创建一个新协议本身,测试其中的漏洞是一个非常广泛的话题。我只想知道是否有人已经做过这样的事情,因为在我看来,在设计协议时肯定会考虑其他模式。如果你对密码学不是很确定,并且与科学同行讨论任何变化,就不要这样做。密码学的历史(包括PGP的开始)很多人都在尝试做聪明的事情,但失败得很惨。如果你需要高级安全性,就不要推出自己的加密。如果你需要CBC,就不要使用OpenPGP。不要编写加密代码,不要更改加密协议。无论如何,这远远超出了最初问题的范围,而且肯定会导致堆栈溢出。