Расшифровка незащищенных файлов PGP с помощью OpenPGP.js

Я работаю над приложением Node, в которое я встроил функцию дешифратора, и использовал модуль npm Openpgp.js для выполнения этой работы. Я беру различные представленные клиентские файлы PGP, созданные с помощью нашего открытого ключа, расшифровываю их, используя наш закрытый ключ, по мере их поступления, и помещаю расшифрованные версии в папку, чтобы я мог получить к ней доступ, и все вроде бы хорошо .... пока поскольку файлы бронированы. Вот несколько примеров строк кода, показывающих порядок событий:

const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8')
openpgp.decrypt({
        message: openpgp.message.readArmored(encryptedData),
        publicKeys,
        privateKey
}).then( (decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data } )

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

-----BEGIN PGP MESSAGE-----
WBh2X7KwfEBDx0LEE1FzlnvxZs44o62FclpTazJpcl9J7DjwVfg9cHCID0TAN6Y6
B3b5bCQQFe1wTgpIkVtd0mFGQx7KGHj4FGte53qseVxC2bfq9PGKRIAUg6olr+82

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

7403 436d e6c0 f941 daac 945b 9a81 f066
6cd2 0032 5df0 9ca2 23a0 6eec a7bb f24c
a941 99a8 1053 ae23 f88b 245c f709 c2b2

..... или как закодированные текстовые файлы, которые выглядят так:

DµÉ‰í+�3K€Ð�˜PªeZ_|Ò®ó0��ãZqRµ3!ŒpuÉW�NZrìÚk´
Aˆ›œiêø8�Ú�ól:äΟ”�6‡)
w�¬ÌŒWÝÚ¢�Q��œ�œ?�H¨¿�œ//�ÃBA�´>(%°�e�

(Эти последние два напоминают то, что я вижу, когда консоль регистрирую "encryptedData" выше в моем примере кода.)

Всякий раз, когда приходят какие-либо незащищенные файлы, процесс завершается неудачно, и я сначала получал несколько разных ошибок в зависимости от типа, показанного выше. Я убрал кодировку utf8 в fs.readFileSync и поставил fromBinary вместо readArmored, чтобы работать с данными как с двоичным мышлением, которое могло бы работать, но затем я получаю сообщение об ошибке «Недопустимый ключ сеанса для дешифрования». Итак, я попытался использовать функцию «decryptSessionKey» перед основным дешифрованием, как это показано в документации, и в результате получил неопределенный ключ и ошибку «Не найден пакет с симметрично зашифрованным ключом сеанса». Кроме того, я, вероятно, лаю не на то дерево, поскольку для использования двоичного файла с Openpgp.js, похоже, требуется пароль, который, как я думаю, отличается от кодовой фразы, которая разблокирует мой закрытый ключ, который является единственным паролем, который у меня есть.

Я просмотрел всю документацию Openpgp.js и погуглил, как сумасшедший, но, похоже, не нашел надежной процедуры, как изменить мой код, который работает для защищенных файлов ASCII для дешифрования файлов, которые не защищены. (Однако каждый поступающий файл расшифровывается быстро и без ошибок при использовании настольной программы для расшифровки, такой как PGP Desktop, поэтому я не могу понять, где мое несоответствие и почему решение неочевидно.) У кого-то есть опыт. с этим или возможным решением?


person threepears    schedule 16.02.2017    source источник
comment
Этот ответ на очень похожий вопрос (который, возможно, является дубликатом) предлагает использовать openpgp.message.fromBinary() вместо openpgp.message.readArmored(). У меня нет более глубокого опыта в JavaScript, но я считаю, что вы могли бы сделать try { message = openpgp.message.readArmored(encryptedData); } catch(err) { message = openpgp.message.fromBinary(encryptedData); } перед вызовом openpgp.decrypt() функции на message.   -  person 0range    schedule 28.02.2017
comment
Спасибо за ответ, хотя я видел этот пост, на который вы ссылались, и, похоже, он не помогает. Когда я использую fromBinary, я получаю сообщение об ошибке формата Uint8array, поскольку я передаю его с помощью строки utf-8. Если я конвертирую строку в Uint8 с помощью утилиты openpgp, а затем передаю данные, я получаю еще одну ошибку: Сообщение об ошибке расшифровки: Недействительный ключ сеанса для расшифровки. Опять же, это файлы, которые я могу просто загрузить в PGP Desktop, и они тут же расшифруют. Должен быть какой-то трюк, который мне не хватает ...   -  person threepears    schedule 02.03.2017


Ответы (1)


Небронированная версия openpgp.message.readArmored() - openpgp.message.read()

Так должно работать примерно так:

const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8')

if encryptedData.startsWith('-----BEGIN PGP MESSAGE-----')
    encryptedMessage = openpgp.message.readArmored(encryptedData)
else
    var TextEncoder = require('text-encoding').TextEncoder;
    var encryptedUint8 = new TextEncoder().encode(encryptedData);
    encryptedMessage = openpgp.message.read(encryptedUint8)

openpgp.decrypt({
    message: encryptedMessage,
    publicKeys,
    privateKey
}).then( (decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data } )

(Строка var TextEncoder здесь не требуется, если вы загружаете TextEncoder ранее в свой код)

person Stobor    schedule 01.03.2017
comment
Спасибо за ответ! Я пробовал это, и, как я и опасался, он отлично работает для защищенных файлов, но другие файлы по-прежнему не проходят. С каждым незащищенным массивом я получаю ошибку TypeError: input.subarray не является функцией. Я могу дать вам трассировку стека, если это поможет, но последний элемент находится в Object.read (/Users/......./openpgp/dist/openpgp.js:16777:61) Если у вас есть дополнительные предложения Что касается того, как решить эту ошибку, я хотел бы их услышать, так как я потратил кучу времени, пытаясь понять это, и это все еще загадка ... - person threepears; 02.03.2017
comment
@threepears - Извините, в моем беглом просмотре документации я не обратил внимания на метод read(), принимающий аргумент типа Uint8array. Я добавлю шаг преобразования в ... - person Stobor; 03.03.2017
comment
@Stobor - Как мне добиться того же самого, но с потоком, вместо того, чтобы читать файл в память? Я собираюсь сделать то же самое, но мои файлы довольно большие, поэтому я не хочу читать их в памяти. У меня он отлично работает с защищенным файловым потоком, но незащищенный просто зависает при вызове 'await openpgp.message.read (readStream, true)'. Кроме того, незащищенный файл, который я пытаюсь расшифровать, кажется, быть в формате закодированного текста, аналогично 2-му небронированному образцу в ОП. - person André Engelbrecht; 11.11.2020