将 BouncyCastle 与 GnuPG 2.1 的“pubring.kbx”文件一起使用

Using BouncyCastle with GnuPG 2.1's `pubring.kbx` file

我正在尝试将 BouncyCastle 与 PGP2 结合使用来读取 public 密钥环。问题是自 GnuPG 2.1 起,它存储在 pubring.kbx 而不是 pubring.gpg。这导致 IOException public key ring doesn't start with public key tag: tag 0x0

知道我是否以及如何将 BC 与 GnuPG 2.1 一起使用吗?

GnuPG 2.1 by default uses the new keybox file format -- 如果没有找到 pubring.gpg。如果有 "legacy" 密钥环文件,将使用它代替。

我不知道 Bouncy Castle 支持 .kbx 文件格式。所以如果你想在 GnuPG 正在使用的相同密钥文件上同时使用 Bouncy Castle,你有三个选择:

  • 另外在其他地方维护一个旧的 pubring.gpg 文件,这意味着需要时 运行 一个 gpg --export--export-secret-keys。旧的pubring.gpg只是密钥的转储,你可以直接使用导出输出作为密钥环。
  • 在您的 GnuPG 主目录中使用 pubring.gpg,换句话说,放弃 .kbx 文件的更好性能以换取兼容性。

    首先,请务必复制整个 ~/.gnupg 文件夹或确保有一个最新的备份!

    最后,迁移过程归结为将密钥箱文件中的信息导出为旧的 OpenPGP 密钥环格式。从上面链接的更新日志中查看从 .kbx 文件迁移到 .gpg 文件的提议:

    $ cd ~/.gnupg
    $ gpg --export-ownertrust > otrust.lst
    $ mv pubring.gpg publickeys
    $ gpg2 --import-options import-local-sigs --import publickeys
    $ gpg2 --import-ownertrust otrust.lst
    

    反向过程应该看起来很相似(假设没有存储密钥,否则请阅读下文,并交换 gpg2gpg 以匹配您机器上安装的二进制文件):

    $ cd ~/.gnupg
    $ gpg2 --export-ownertrust > otrust.lst
    $ gpg2 --export > pubring.gpg
    $ mv pubring.kbx pubring.kbx~
    $ gpg2 --import-options import-local-sigs
    $ gpg2 --import-ownertrust otrust.lst
    

    --export结果可以直接作为新的keyring,不需要--import这个文件。 Ownertrust 可能应该以类似的方式复制,我只是保留了这里提出的变更日志。

    如果你也存储了私钥,我最好先将它们导出到另一个文件,最后再导入它们:

    $ cd ~/.gnupg
    $ gpg2 --export-secret-keys > secret-keys.gpg
    $ gpg2 --export-ownertrust > otrust.lst
    $ gpg2 --export > pubring.gpg
    $ mv pubring.kbx pubring.kbx~
    $ gpg2 --import-options import-local-sigs --import secret-keys.gpg
    $ gpg2 --import-ownertrust otrust.lst
    
  • 为充气城堡实施 .kbx 格式。

从 1.60 版本开始,BouncyCastle 支持读取 KeyBox 文件。

https://www.bouncycastle.org/releasenotes.html

A parser has now been added for the GNU keybox file format. The GPG SExpr parser now covers a wider range of key types.

KeyBoxTest.java中有一些示例代码。