You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用neuhalfen BouncyCastle OpenPGP 2.3.0加密提示未找到demouser公钥

问题原因
  • 密钥用户ID匹配规则不匹配:GPG生成的密钥默认用户ID格式为姓名 <邮箱>(例如demouser <demo@example.com>),而neuhalfen封装库的toRecipient方法默认执行完整用户ID精确匹配,不会模糊匹配用户ID中的子串,你仅传入demouser自然匹配不到对应公钥。
  • 密钥导入异常:你使用gpg --export -a导出的是ASCII装甲格式的公钥,如果代码中读取公钥文件时使用了字符流而非二进制流读取,会导致公钥字节数组损坏,无法被库正确识别。
  • 私钥密码配置错误:如果你生成GPG密钥时设置了保护密码,代码中KeyringConfigCallbacks.withPassword("")传入空密码会导致私钥加载失败,也会触发关联的密钥校验报错。
解决方法
  1. 优先使用完整用户ID或密钥ID匹配
    首先执行命令查看密钥的完整信息:
    gpg --list-keys --keyid-format LONG demouser
    从输出中获取两种可用的匹配标识:
  • 完整用户ID:取uid行的完整内容,例如demouser <demo@example.com>,替换代码中toRecipient("demouser")和andSignWith("demouser")的参数为该完整字符串
  • 公钥ID:取pub行中/后的16位十六进制ID,直接传入该ID作为参数,匹配准确率更高,不会受用户ID格式影响
  1. 修复密钥导入逻辑
    读取公钥、私钥文件时统一使用二进制流读取,示例代码:
// 读取公钥文件示例
byte[] pubKey = Files.readAllBytes(Paths.get("demouser-public.key"));
// 读取私钥文件示例
byte[] privateKey = Files.readAllBytes(Paths.get("demouser-private.key"));

如果还是导入失败,可以去掉导出命令的-a参数,导出二进制格式的密钥文件,减少格式解析问题:
gpg --export demouser > demouser-public.key
gpg --export-secret-keys demouser > demouser-private.key

  1. 修正私钥密码配置
    如果你的密钥设置了保护密码,将KeyringConfigCallbacks.withPassword("")的参数替换为实际的密钥密码即可。

  2. 可选调试方案
    如果以上步骤都无法解决,可以添加临时调试代码,确认密钥是否正常导入:

inMemoryKeyring.getPublicKeys().forEach(pubKey -> {
    System.out.println("公钥ID:" + Long.toHexString(pubKey.getKeyID()));
    pubKey.getUserIDs().forEachRemaining(uid -> System.out.println("关联用户ID:" + uid));
});

运行后即可看到所有已导入公钥的用户ID和密钥ID,确认是否和你传入的匹配参数一致。

内容的提问来源于stack exchange,提问作者user518066

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:48:03