【问题标题】:OpenPGP Encryption Using BouncyCastle Lightweight API使用 BouncyCastle 轻量级 API 的 OpenPGP 加密
【发布时间】:2016-10-05 08:01:24
【问题描述】:

我必须使用 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 进行编码(该库处理我在内部使用初始化向量提到的所有上述问题),然后使用公钥我提供的。如何让它改用 AES-CBC?

【问题讨论】:

  • 为什么密钥大小会迫使您使用轻量级 API?
  • 据我所知,如果我们需要 256 位的 aes 密钥大小,则需要无限强度管辖策略文件。我的用例不允许这样做,因为它不是便携式解决方案。
  • 好的,有道理。无限的力量确实需要摆弄 JRE 目录,但这并不总是可行的。
  • 所以问题还是一样。如何使用自定义对称算法构建 PGP 加密文件?

标签: java encryption aes bouncycastle pgp


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。作为后续,如果我可以修改充气城堡中的源代码以使用 CBC,我应该担心任何安全漏洞吗?我知道更改阻塞模式在功能上等同于创建一个新协议本身,并且测试其中的漏洞是一个非常广泛的话题。我只是想知道是否有人已经做过这样的事情,因为在我看来,在设计协议时肯定会考虑其他模式
  • 如果您对密码学不太确定并与科学同行讨论任何变化,请不要这样做。密码学的历史(包括 PGP 的起源)充满的人试图做聪明的事情,却惨遭失败。如果您需要高级安全性,请不要推出自己的加密货币。如果您需要 CBC,请不要选择 OpenPGP。不要编写加密代码,不要更改加密协议。无论如何,这远远超出了原始问题的范围,而且肯定超出了 Stack Overflow 的主题。
猜你喜欢
  • 1970-01-01
  • 2013-09-22
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
相关资源
最近更新 更多