/ / Шифрування файлів за допомогою SJCL на стороні клієнта - javascript, шифрування, кодування, типізовані масиви, sjcl

Шифрування файлів з клієнтською стороною SJCL - javascript, шифрування, кодування, типізовані масиви, sjcl

У мене є проблема шифрування файлів з SJCL і javascript.

Мені вдалося зашифрувати текстові файли за допомогою API FileReader і readAsBinaryString. Коли мова йде про шифрування pdf / png / .., то проблема виникає, ймовірно, через кодування.

Я виявив, що я можу використовувати readAsArrayBuffer, який ідеально підходить для цього завдання, тому я в основному читаю файл і створюю новий типізований масив з new Uint8Array() але я не знаю, як саме я повинен шифрувати такі дані.

Ось мій код:

/** Convert from an array of bytes to a bitArray. */
function toBitArrayCodec(bytes) {
var out = [], i, tmp=0;
for (i=0; i<bytes.length; i++) {
tmp = tmp << 8 | bytes[i];
if ((i&3) === 3) {
out.push(tmp);
tmp = 0;
}
}
if (i&3) {
out.push(sjcl.bitArray.partial(8*(i&3), tmp));
}
return out;
}

/** Convert from a bitArray to an array of bytes. */
function fromBitArrayCodec(arr) {
var out = [], bl = sjcl.bitArray.bitLength(arr), i, tmp;
for (i=0; i<bl/8; i++) {
if ((i&3) === 0) {
tmp = arr[i/4];
}
out.push(tmp >>> 24);
tmp <<= 8;
}
return out;
}

var reader = new FileReader();
reader.readAsArrayBuffer(fileData); //filedata comes from function
reader.onload = function() {
var bytes = new Uint8Array(reader.result);
var bits = toBitArrayCodec(bytes);
var crypt = sjcl.encrypt("aaaaa", bits);

var decrypt = sjcl.decrypt("aaaaa", crypt);
var byteNumbers = fromBitArrayCodec(decrypt);
var byteArray = new Uint8Array(byteNumbers);
saveData(byteArray, "png.png");

Я отримую помилку

Uncaught URIError: URI malformed sjcl.js:12sjcl.codec.utf8String.fromBits sjcl.js:12sjcl.json.decrypt sjcl.js:44reader.onload

Мені потрібно знати, як шифрувати uint8array або інша альтернатива, як шифрувати (pdf / png / ..) файли.

Відповіді:

2 для відповіді № 1

Очікується, що відкритий текст у sjcl буде utf8закодовані. Шифрування вбудованого вручну BitArray працює, тому що шифрування виконується на BitArray, і це не повинно бути декодовано. робота, оскільки містить недруковані символи, тому що джерело, ймовірно, двійкове.

Рішенням було б кодувати його як Base64 перед шифруванням і конвертувати його після розшифрування.

var bytes = new Uint8Array(reader.result);
var bits = toBitArrayCodec(bytes);
var base64bits = sjcl.codec.base64.fromBits(bits); // added
var crypt = sjcl.encrypt("aaaaa", base64bits);

var base64decrypt = sjcl.decrypt("aaaaa", crypt);
var decrypt = sjcl.codec.base64.toBits(base64decrypt); // added
var byteNumbers = fromBitArrayCodec(decrypt);
var byteArray = new Uint8Array(byteNumbers);