使用OpenPGP.js解密PGP文件时出现SecretKey.decrypt相关TypeError错误
报错根因分析
- 版本兼容问题:你当前使用的OpenPGP.js版本大概率不支持Kleopatra生成的密钥算法。Kleopatra默认生成的是ECC(ED25519/ECDH)类型密钥,低于v5的OpenPGP.js版本对这类现代非对称算法的私钥解析逻辑存在缺陷,会导致密钥内部私有字段解析为null,调用decrypt方法读取type属性时就会触发该报错。你可以先升级OpenPGP.js到v5及以上稳定版本验证。
- 私钥格式解析异常:你传入
openpgp.key.readArmored的私钥内容可能存在格式问题,比如Kleopatra导出时同时带出了公钥片段、私钥的armor头/尾不完整、内容中间夹杂多余空白字符/转义字符,虽然你判断了privateKey.keys[0]存在,但密钥内部的加密私有片段并没有被正确解析。你可以增加两行校验代码确认解析状态:console.log(privateKey.isPrivate()) // 必须返回true console.log(privateKey.isDecrypted()) // 必须返回false - 密码编码不匹配:如果你的密钥密码包含中文、特殊符号,Kleopatra生成密钥时默认用UTF-8编码处理密码,若你代码中传入的
passphrase编码不一致、或者前后携带多余空白字符,部分版本的OpenPGP.js不会抛出明确的密码错误,反而会触发内部空指针报错。你可以先用纯英文数字的简单密码生成测试密钥验证该问题。 - 多子密钥解析失败:Kleopatra生成的PGP密钥默认附带独立的加密子密钥、签名子密钥,若OpenPGP.js解析子密钥失败,调用主密钥的decrypt方法也会触发空指针异常。你可以调用
privateKey.getEncryptionKey()确认子密钥可以被正常读取。
内容的提问来源于stack exchange,提问作者Jay Dadhaniya
相关产品推荐
相关产品推荐

