【问题标题】:Openpgp.js can't decrypt pgp messageOpenpgp.js 无法解密 pgp 消息
【发布时间】:2019-07-14 01:52:22
【问题描述】:

我使用的是 openpgp.js 版本 2.2.1。

所以我已经成功地加密了一条消息

const options = {
    data: voteObject.option,       // input as Message object
    publicKeys: (pgp.key.readArmored(pubkey)).keys, // for encryption
};

pgp.encrypt(options).then(function(ciphertext) {
    console.log(ciphertext.data);
});

这会记录加密的消息。我现在遇到的问题是我无法解密它。在这一点上我完全不知所措,老实说,我已经尝试了一切,以至于我不知道自己在做什么了。我知道这没什么好用的,但我真的没有其他东西可以提供。

任何建议都会有很大帮助!

【问题讨论】:

  • 我使用 crypto-js 进行加密和解密。如果您需要该解决方案,我随时准备为您提供帮助。
  • 究竟是什么不起作用?您收到任何错误消息吗?你传递给encrypt()options 的值是多少?
  • @pschild 选项包含我要加密的字符串和一个 pgp 公钥,当我尝试解密时,我传递了以下选项:加密的消息、私钥和密码。然后我得到这个错误:Error decrypting message: No symmetrically encrypted session key packet found.

标签: javascript angular encryption openpgp openpgp.js


【解决方案1】:

我认为您将passphrase 用于密钥和password 用于“简单地”加密字符串。
通常,在 PGP 中,发送者使用接收者的公钥加密消息。然后,消息的接收者可以用他的秘密密码解密他的私钥,并使用得到的解密后的私钥,他可以解密消息

我在下面添加了一个工作示例:

加密

const receiverPublicKey = ...;

let publicKeys = (await openpgp.key.readArmored(receiverPublicKey)).keys;
let options = {
    data: 'Hello, World!',
    publicKeys: publicKeys
};

return openpgp.encrypt(options)
    .then((encryptedMessageObject) => {
        return encryptedMessageObject.data; // -----BEGIN PGP MESSAGE----- ... wcBMA0rHUQJA4dCdAQg...
    });

解密

const receiverPrivateKey = ...;
const receiverPassphrase = 'secret';
const encryptedMessage = '-----BEGIN PGP MESSAGE----- ... wcBMA0rHUQJA4dCdAQg...';

let privKeyObj = (await openpgp.key.readArmored(receiverPrivateKey)).keys[0];
await privKeyObj.decrypt(receiverPassphrase);

let options = {
    message: await openpgp.message.readArmored(encryptedMessage),
    privateKey: privKeyObj
};

return openpgp.decrypt(options)
    .then((plaintextObject) => {
        return plaintextObject.data; // Hello, World!
    });

这是一个发送者和一个接收者使用 PGP 的通常过程(请注意,邮件的 signingchecking the signature 缺失)。

现在解密options中还有password
为此,请参阅文档中的示例:

var options, encrypted;

options = {
    data: 'Hello, World!',      // input as String
    passwords: ['secret stuff'] // multiple passwords possible
};

openpgp.encrypt(options).then(function(ciphertext) {
    encrypted = ciphertext.data; // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
});
options = {
    message: openpgp.message.readArmored(encrypted), // parse armored message
    password: 'secret stuff'                         // decrypt with password
};

openpgp.decrypt(options).then(function(plaintext) {
    return plaintext.data; // 'Hello, World!'
});

在这种情况下,password 用于加密和解密消息 - 根本没有公钥或私钥。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2017-09-18
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2020-12-13
    相关资源
    最近更新 更多