使用BouncyCastle轻量级API的OpenPGP加密

时间:2016-06-05 18:03:42

标签: java encryption aes bouncycastle pgp

我必须使用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]);

从查看open函数的代码我已经确定输入流首先使用AES-CFB编码(该库处理我在内部使用Initialization Vectors提到的所有上述问题)然后使用公钥我提供的。如何让它使用AES-CBC?

1 个答案:

答案 0 :(得分:2)

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

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