簡體   English   中英

使用SJCL客戶端加密文件

[英]Encrypting files with SJCL client-side

我有問題用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM