首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用SJCL客户端加密文件

用SJCL客户端加密文件
EN

Stack Overflow用户
提问于 2014-11-04 11:29:39
回答 1查看 2.2K关注 0票数 5

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

我使用FileReader API和readAsBinaryString对文本文件进行加密。当涉及到加密pdf/png/.那么问题很可能是由于编码引起的。

我发现我可以使用非常适合这个任务的readAsArrayBuffer,所以我基本上可以读取文件并使用new Uint8Array()创建新的类型化数组,但是我不知道我应该如何加密这样的数据。

这是我的密码:

代码语言:javascript
复制
/** 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');

我错了

代码语言:javascript
复制
Uncaught URIError: URI malformed sjcl.js:12sjcl.codec.utf8String.fromBits sjcl.js:12sjcl.json.decrypt sjcl.js:44reader.onload

我需要知道如何加密uint8array或另一种加密方法(pdf/png/.)文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-04 20:57:36

预计sjcl中的明文将被utf8编码。对手工构建的bitArray进行加密是有效的,因为加密是在bitArray上完成的,而不必对其进行解码。但是在解密的末尾是一个编码步骤,它将恢复的明文bitArray转换为utf8string。这不起作用,因为它包含不可打印的字符,因为源可能是二进制的。

解决方案是在加密之前将其编码为Base64,并在解密后将其转换回来。

代码语言:javascript
复制
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);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26734033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档