我正在使用 Node.js 上传在客户端加密的文件,我使用 SJCL(Stanford Javascript Crypto Library)用 Javascript 加密文件。
但我注意到即使使用相同的密码短语,加密的输出或结果总是不同的。
经过几次研究后,我发现这是因为盐每次都是随机的,我需要做一个“nosalt”(对不起,我对这里的所有密码都是新手,Node.js)
每次密码相同时,如何更改我的代码(或 SJCL 代码)以生成精确的加密输出。
我的应用基于“Cryptloader”项目,你可以在这里找到它:https ://github.com/Kryil/Cryptloader
加密:
var part = file_queue[data["id"]].slice(start, end)
var reader = new FileReader()
reader.onload = function(e)
{
var passwd = document.getElementById("password").value
console.log("Uploading arraybuffer of size " + e.target.result.byteLength)
var i32a = new Int32Array(e.target.result)
var out = i32a.toJSONArray()
console.log("crypting: " + out)
var crypted = sjcl.encrypt(passwd, out)
ws.send(JSON.stringify({
"type": "fileslice",
"data": {"id": data["id"], "slice": slice, "data": crypted}
}))
}
reader.readAsArrayBuffer(part)
解密:
var decrypted = sjcl.decrypt(passwd, data["data"])
file_contents[file]["data"].push(new Int32Array(JSON.parse(decrypted)))
这是无关紧要的问题,但并非所有文件都正确上传,其中一些会产生错误,但是当我将 Int32Array 更改为 Int16Array 或 Int8Array 时,它对它们有效,但对其他文件产生错误,是什么原因以及如何修复它。错误:
Uncaught RangeError: ArrayBuffer length minus the byteOffset is not a multiple of the element size.
(Chrome Latest version, Win 7)