Openpgp.js не может расшифровать сообщение pgp

Я использую 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);
});

Это регистрирует зашифрованное сообщение. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу ее расшифровать. На данный момент я в полной растерянности, и, честно говоря, я перепробовал все до такой степени, что уже не знаю, что я делаю. Я знаю, что с этим не так много работы, но мне больше нечего дать.

Любые предложения вообще будут огромной помощью!


person chef    schedule 20.02.2019    source источник
comment
Я использовал crypto-js для шифрования и дешифрования. Если вам нужно это решение, я готов вам помочь.   -  person AlokeT    schedule 20.02.2019
comment
Что именно не работает? Вы получаете сообщение об ошибке? И какое значение options вы передаете в encrypt()?   -  person pschild    schedule 20.02.2019
comment
Параметры @pschild содержат строку, которую я хочу зашифровать, и открытый ключ pgp. Когда я пытаюсь расшифровать, я передаю следующие параметры: зашифрованное сообщение, закрытый ключ и фразу-пароль. Затем я получаю эту ошибку: Error decrypting message: No symmetrically encrypted session key packet found.   -  person chef    schedule 20.02.2019


Ответы (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 с одним отправителем и одним получателем (обратите внимание, что signing сообщения и checking 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 — вообще без открытого или закрытого ключа.

Надеюсь, это поможет!

person pschild    schedule 20.02.2019