gpt4 book ai didi

javascript - 使用 SJCL 客户端加密文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:46:02 26 4
gpt4 key购买 nike

我在使用 SJCL 和 javascript 加密文件时遇到问题。

我已经成功地使用 FileReader API 和 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/..) 文件。

最佳答案

sjcl中的明文应该是utf8编码的。加密手动构建的 bitArray 是可行的,因为加密是在 bitArray 上完成的,不需要解码。但是在解密的最后是一个编码步骤,它将恢复的明文 bitArray 转换为 utf8string。这是行不通的,因为它包含不可打印的字符,因为源可能是二进制的。

解决方案是在加密之前将其编码为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);

关于javascript - 使用 SJCL 客户端加密文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26734033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com