无法使用 OpenPGP.js 解密未装甲的 pgp 文件:会话密钥解密失败
Unable to decrypt an unarmored pgp file with OpenPGP.js: Session key decryption failed
我有一个已加密的 CSV 文件,现在是一个未加密的 PGP 文件。
我正在尝试使用 OpenPGP.js 5.0.0 和 Node.js 14.17.5 对其进行解密,但一直碰壁。
起初,我根据项目示例尝试了以下代码:
const passphrase = 'pass';
const publicKeyArmored = '... public ...';
const publicKey = await openpgp.readKey({ armoredKey: publicKeyArmored });
const privateKeyArmored = '... private ...';
const privateKey = await openpgp.decryptKey({
privateKey: await openpgp.readPrivateKey({ armoredKey: privateKeyArmored }),
passphrase,
});
const binaryMessage = fs.createReadStream('/path/to/file.csv.pgp');
const message = await openpgp.readMessage({
binaryMessage,
});
const { data: decrypted, signatures } = await openpgp.decrypt({
message,
verificationKeys: publicKey,
decryptionKeys: privateKey,
});
但是 decrypt
函数抛出:Error: Error decrypting message: Session key decryption failed.
然后我尝试添加代码来手动解密会话密钥:
const sessionKey = await openpgp.decryptSessionKeys({
decryptionKeys: privateKey,
message,
});
但是 decryptSessionKeys
函数抛出:Error: Error decrypting session keys: Session key decryption failed.
我怀疑该文件可能被错误地对称加密,所以我尝试将对 decrypt
的调用修改为:
const { data: decrypted, signatures } = await openpgp.decrypt({
message,
passwords: passphrase,
});
但是 decrypt
函数抛出:Error: Error decrypting message: No symmetrically encrypted session key packet found.
作为完整性测试,我决定尝试使用 gpg
CLI 解密该文件。
我使用以下方法导入了装甲密钥对:
gpg --import key.public.pgp
gpg --allow-secret-key-import --import key.private.pgp
然后使用以下方法解密文件:
gpg --show-session-key /path/to/file.csv.pgp
提示输入私钥密码后,文件已成功解密,输出如下:
gpg: WARNING: no command supplied. Trying to guess what you mean ...
gpg: encrypted with rsa4096 key, ID <redacted>, created 2021-09-02
"<redacted> (<redacted>) <redacted>"
gpg: used key is not marked for encryption use.
gpg: session key: '<redacted>'
我做错了什么?为什么使用 OpenPGP.js 解密失败但使用 GnuPG 成功?
邮件似乎是用主密钥加密的,主密钥被标记为仅签名。
将allowInsecureDecryptionWithSigningKeys
解密配置设置为true
解决了这个问题:
const { data: decrypted } = await openpgp.decrypt({
message,
config: {
allowInsecureDecryptionWithSigningKeys: true,
},
verificationKeys: publicKey,
decryptionKeys: privateKey,
});
我有一个已加密的 CSV 文件,现在是一个未加密的 PGP 文件。
我正在尝试使用 OpenPGP.js 5.0.0 和 Node.js 14.17.5 对其进行解密,但一直碰壁。
起初,我根据项目示例尝试了以下代码:
const passphrase = 'pass';
const publicKeyArmored = '... public ...';
const publicKey = await openpgp.readKey({ armoredKey: publicKeyArmored });
const privateKeyArmored = '... private ...';
const privateKey = await openpgp.decryptKey({
privateKey: await openpgp.readPrivateKey({ armoredKey: privateKeyArmored }),
passphrase,
});
const binaryMessage = fs.createReadStream('/path/to/file.csv.pgp');
const message = await openpgp.readMessage({
binaryMessage,
});
const { data: decrypted, signatures } = await openpgp.decrypt({
message,
verificationKeys: publicKey,
decryptionKeys: privateKey,
});
但是 decrypt
函数抛出:Error: Error decrypting message: Session key decryption failed.
然后我尝试添加代码来手动解密会话密钥:
const sessionKey = await openpgp.decryptSessionKeys({
decryptionKeys: privateKey,
message,
});
但是 decryptSessionKeys
函数抛出:Error: Error decrypting session keys: Session key decryption failed.
我怀疑该文件可能被错误地对称加密,所以我尝试将对 decrypt
的调用修改为:
const { data: decrypted, signatures } = await openpgp.decrypt({
message,
passwords: passphrase,
});
但是 decrypt
函数抛出:Error: Error decrypting message: No symmetrically encrypted session key packet found.
作为完整性测试,我决定尝试使用 gpg
CLI 解密该文件。
我使用以下方法导入了装甲密钥对:
gpg --import key.public.pgp
gpg --allow-secret-key-import --import key.private.pgp
然后使用以下方法解密文件:
gpg --show-session-key /path/to/file.csv.pgp
提示输入私钥密码后,文件已成功解密,输出如下:
gpg: WARNING: no command supplied. Trying to guess what you mean ...
gpg: encrypted with rsa4096 key, ID <redacted>, created 2021-09-02
"<redacted> (<redacted>) <redacted>"
gpg: used key is not marked for encryption use.
gpg: session key: '<redacted>'
我做错了什么?为什么使用 OpenPGP.js 解密失败但使用 GnuPG 成功?
邮件似乎是用主密钥加密的,主密钥被标记为仅签名。
将allowInsecureDecryptionWithSigningKeys
解密配置设置为true
解决了这个问题:
const { data: decrypted } = await openpgp.decrypt({
message,
config: {
allowInsecureDecryptionWithSigningKeys: true,
},
verificationKeys: publicKey,
decryptionKeys: privateKey,
});