В настоящее время я шифрую файлы в веб-приложении 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 });
},