我必须使用 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/