java - 使用 BouncyCaSTLe 轻量级 API 进行 OpenPGP 加密

标签 java encryption aes bouncycastle pgp

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

最明显的方法是使用 AES 引擎对其进行加密,然后使用公钥对结果进行加密,就像在 OpenPGP 中所做的那样。然而,这需要我生成初始化 vector 和 AES key 。这些是我希望库做的事情,因为在做这些事情时可能会出错。

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

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]);

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

最佳答案

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

您不能将 CBC 与 OpenPGP 一起使用。 OpenPGP 规范仅允许special variant of CFB 。如果您需要 CBC,则必须选择其他加密系统;如果将 OpenPGP 消息放在一起更重要,请坚持使用 OpenPGP CFB 模式。如果您在 CBC 模式下创建 OpenPGP 消息,它们不遵循 OpenPGP 的标准,并且其他实现(如 PGP、“普通”BouncyCaSTLe”和 GnuPG)将无法读取该消息。

关于java - 使用 BouncyCaSTLe 轻量级 API 进行 OpenPGP 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37645113/

相关文章:

java - 如何在android studio中将变量名作为参数传递

java - jsp中不显示值

php - 调用未定义函数 Illuminate\Encryption\openssl_decrypt()

php - c++中的加密和php中的解密有什么问题

java - 使用 aes 从 java 解密文件中的额外字符

java - java中删除字符串中的重复字符而不使用字符串函数

java - 未知模式字母 : T - Parse string date with pattern T to LocalDateTime

sql-server - SQL Server 2005 : what data type to use to store passwords hashed by SHA-256 algorithm?

C# AES 加密字节数组

java - AES 128 DOT NET 和 Java 兼容性