使用 BouncyCastle 轻量级的 OpenPGP 加密 API

OpenPGP Encryption Using BouncyCastle Lightweight API

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

最明显的方法是使用 AES 引擎对其进行加密,然后使用 public 密钥对结果进行加密,就像在 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]);

通过查看 open 函数的代码,我确定输入流首先使用 AES-CFB 进行编码(该库处理了我在内部提到的初始化向量中的所有上述问题),然后使用public 我提供的密钥。我如何让它改用 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)将无法读取消息。