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

使用PGPainless导入密钥时出现“No key data found”错误求助

问题:PGPainless-SOP调用extractCert时提示“No key data found”

操作背景

在Mac系统上创建并导出PGP密钥,执行命令如下:

% gpg --generate-key
% gpg --export --armor --output new.pub B42B1AF5 

导出的公钥内容:

-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEZ1qw5BYJKwYBBAHaRw8BAQdAnS7bhQ3Knq2lrnLs/OLjaubtBX8hV2asKd0q
2aSfoPO0HHNhaGFuZCA8c2FoYW5kekBob3RtYWlsLmNvbT6ImQQTFgoAQRYhBLXY
surbx74eVf/7uUewZ0+0Kxr1BQJnWrDkAhsDBQkFo5qABQsJCAcCAiICBhUKCQgL
AgQWAgMBAh4HAheAAAoJEEewZ0+0Kxr1GAYA/jGm3n7zzXU7XzkJKDMOitECB1OS
St/OeIDpIjg0PL9gAQDySb5KgFBEslg+TvJ7GwYqZVaTXZoNVg7+VTvVXxvDAbg4
BGdasOQSCisGAQQBl1UBBQEBB0B2OXM9tUPz/4yakILx8PtrikrqxuOSIN3I/wEU
vmvrTQMBCAeIfgQYFgoAJhYhBLXYsurbx74eVf/7uUewZ0+0Kxr1BQJnWrDkAhsM
BQkFo5qAAAoJEEewZ0+0Kxr1jtsBAPYjwX9Q+CXJW5adGz67N9zZzKSsRv+gd4Xc
1g8PbD5BAQD3rIqPWvU5XjDQ8o877XiXoOCLs+vFWk06pOF0Tj+bBw==
=sKDL
-----END PGP PUBLIC KEY BLOCK-----

代码与依赖

使用PGPainless-SOP编写的代码:

import sop.SOP;

SOP sop = new SOPImpl();
byte[] cert = sop.extractCert()
        .key(new FileInputStream(encryptionKeyPath))
        .getBytes();

Maven依赖配置:

<dependency>
    <groupId>org.pgpainless</groupId>
    <artifactId>pgpainless-sop</artifactId>
    <version>1.7.2</version>
</dependency>

报错信息

sop.exception.SOPGPException$BadData: org.bouncycastle.openpgp.PGPException: No key data found.

    at org.pgpainless.sop.KeyReader$Companion.readSecretKeys(KeyReader.kt:39)
    at org.pgpainless.sop.ExtractCertImpl.key(ExtractCertImpl.kt:22)
    at con.com.pkg.uploader.utils.app.encryptInputStream(Utils.java:94)
    at con.com.pkg.uploader.utils.app.encryptInputStreamTest(UtilsTest.java:22)
Caused by: org.bouncycastle.openpgp.PGPException: No key data found.
    ... 45 more

问题原因与解决方案

核心原因

extractCert()方法的设计逻辑是读取PGP私钥文件,从中提取出对应的公钥证书部分。但你传入的是用gpg --export导出的纯公钥文件,库在尝试读取私钥数据时自然会找不到,因此抛出“No key data found”异常。

解决办法

  1. 直接使用公钥文件:如果仅需使用公钥,无需调用extractCert(),直接读取公钥文件的字节内容即可,因为导出的new.pub本身就是完整的公钥证书。
  2. 传入私钥文件:若确实需要通过extractCert()提取证书,需先导出私钥文件,命令如下:
    % gpg --export-secret-keys --armor --output new.priv B42B1AF5
    
    然后将代码中的encryptionKeyPath指向这个私钥文件。
  3. 检查文件路径:确认encryptionKeyPath指向的文件存在且路径正确,避免因文件找不到导致读取失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:04:51