Невозможно расшифровать незащищенный файл pgp с помощью OpenPGP.js: не удалось расшифровать ключ сеанса

У меня есть файл 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,
});

Но функция выдает: 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.

Я подозревал, что файл мог быть по ошибке зашифрован симметрично, поэтому я попытался изменить вызов на:

      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?

1 ответ

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

Установка allowInsecureDecryptionWithSigningKeys конфигурация дешифрования для true решает эту проблему:

      const { data: decrypted } = await openpgp.decrypt({
  message,
  config: {
    allowInsecureDecryptionWithSigningKeys: true,
  },
  verificationKeys: publicKey,
  decryptionKeys: privateKey,
});
Другие вопросы по тегам