OpenPGP. js расшифровка зашифрованных файлов - PullRequest
0 голосов
/ 06 марта 2020

В настоящее время я шифрую файлы в веб-приложении vuejs, используя OpenPGP. js на стороне клиента, используя мой ключ gpg publi c для шифрования.

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

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

Если я шифрую файл txt / csv, содержимое идентично, но размеры файла различаются (после загрузки на локальный компьютер для дешифрования)

Если я шифрую файл jpg / zip, содержимое идентично, но размеры файла отличаются, и я не могу разархивировать ZIP-файл или посмотреть JPG-файл. Я задаюсь вопросом, есть ли какая-нибудь идея относительно того, что я делаю неправильно?

Несколько замечаний, прежде чем мы перейдем к коду: я попытался отправить его одним большим куском, но этого не произошло сделать разницу, я также попытался отправить его как readFromText вместо преобразования utf8intarray и readFromBinary. Причиной появления отдельных фрагментов является то, что любой фрагмент размером не менее 5 МБ будет отклонен при многоэлементной загрузке s3. (Но я также покончил с этим безрезультатно)

async encryptContent({commit, state}){
        await openpgp.initWorker({ path: '/js/openpgp.worker.min.js' }, 3);

        if (state.encrypted){
            return true;
        }

        if (state.publicKey == null){
            let data = await backend.getPublicKey();
            commit('setPublicKey', {key: data.key});
        }

        if (state.uploadUrl === ""){
            let data = await backend.getUploadUrl();
            commit('setUploadUrl', {uploadUrl: data.url});
        }
        commit('clearBlob');
        var textEncoding = require('text-encoding'); 
        var TextEncoder = textEncoding.TextEncoder;
        for (let i=0; i<state.content.length; i+=CHUNK_SIZE){
            let uint8 = new TextEncoder("utf-8").encode(state.content.substring(i, i+CHUNK_SIZE));
            var cipherText = await openpgp.encrypt({
                message: await openpgp.message.fromBinary(uint8), // input as Message object
                publicKeys: (await openpgp.key.readArmored(state.key)).keys,
                format: 'binary',

            })

                while (cipherText.data.length < CHUNK_SIZE){
                    cipherText.data+= (cipherText.data.length === CHUNK_SIZE-1) ? "\n" : " ";
                }


                commit('addBlob', {blob: new Blob([cipherText.data])} );

        }
        commit('setEncrypted', { encrypted: true });



    },
...