简体   繁体   中英

Openpgp.js can't decrypt pgp message

I'm using openpgp.js version 2.2.1.

So I've managed to encrypt a message just fine

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);
});

This logs the encrypted message. The problem I'm now having is that I can't decrypt it. I'm at a complete loss at this point and to be honest I've tried everything to the point I don't know what I'm doing anymore. I know this isn't much to work with but I don't really have anything else to give.

Any suggestions at all would be a huge help!

I think you are mixing up the passphrase for a key and the password for "simply" encrypting a string.
Usually, in PGP a sender is encrypting a message with the receiver's public key . The receiver of the message can then decrypt his private key with his secret passphrase and with the resulting decrpyted private key he can decrypt the message .

I added a working example below:

Encryption

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...
    });

Decryption

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!
    });

This is the usual process of using PGP with one sender and one receiver (note that the signing of the message and checking the signature is missing).

Now there's also password in the decrypt options .
For that, see the example from the docs:

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!'
});

In this case, a password is used to encrypt and decrypt a message - no public or private key at all.

I hope that helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM