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

使用OpenPGP.js解密非装甲PGP文件提示会话密钥解密失败如何解决

问题根源

你遇到的报错核心原因是OpenPGP.js默认对密钥使用用途做严格校验,而GnuPG仅对不符合用途的密钥输出警告不拦截解密操作。
从你给出的gpg解密日志可以看到明确提示:gpg: used key is not marked for encryption use.,说明你使用的密钥对没有开启加密用途标记,OpenPGP.js默认拒绝用这类密钥执行解密。

解决方法

方案1(推荐,符合OpenPGP规范)

重新生成密钥对,生成时确保开启密钥的加密用途标记,后续使用新密钥加密/解密即可。

方案2(临时兼容旧密钥)

在调用openpgp.decrypt或openpgp.decryptSessionKeys时,添加配置项关闭密钥用途校验,修改后的解密代码如下:

const { data: decrypted, signatures } = await openpgp.decrypt({
  message,
  verificationKeys: publicKey,
  decryptionKeys: privateKey,
  // 新增配置项,允许用没有加密用途标记的密钥解密
  config: {
    allowInsecureDecryptionWithSigningKeys: true
  }
});

如果需要手动解密会话密钥,对应修改如下:

const sessionKey = await openpgp.decryptSessionKeys({
  decryptionKeys: privateKey,
  message,
  config: {
    allowInsecureDecryptionWithSigningKeys: true
  }
});

补充排查点

如果修改配置后仍然报错,可以检查以下两个常见问题:

  • 确认你传入的私钥和加密文件使用的公钥是配对的,核对gpg输出里的密钥ID和你导入的密钥ID是否一致
  • 如果你使用的是非装甲二进制文件,可以尝试先把文件内容读成Buffer再传入,替换流的传入方式,避免流读取不完全的问题:
const binaryMessage = fs.readFileSync('/path/to/file.csv.pgp');
const message = await openpgp.readMessage({
  binaryMessage,
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:48:00