当PassPhrase相同时,需要SJCL做相同的encryption的AES 256输出

我正在使用Node.js上传在客户端encryption的文件,并使用SJCL(Stanford Javascript Crypto Library)来使用Javascriptencryption文件。

但是我注意到,即使使用相同的PassPhrase,输出或encryption的结果也是不同的。

经过几次研究之后,我发现这是因为盐每次都是随机的,我需要做一个“nosalt”(对不起,我对这里的所有东西都是新的,cryptographie,Node.js)

每次密码相同时,如何更改我的代码(或SJCL代码)以生成确切的encryption输出。

我的应用程序基于“Cryptloader”项目,你可以在这里find它: https : //github.com/Kryil/Cryptloader

encryption:

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))) 

这是不相关的问题,但并不是所有的file upload正确,其中一些产生的错误,但是当我更改Int32Array为Int16Array或Int8Array,它适用于他们,但产生其他文件的错误,是什么原因,以及如何解决它。 错误:

 Uncaught RangeError: ArrayBuffer length minus the byteOffset is not a multiple of the element size. (Chrome Latest version, Win 7) 

这不仅仅是salt ,使得密文每次都是不同的。 但是这些都是提供语义安全性的安全特性,你不应该禁用,也不应该禁用,因为salt和iv可以包含在密文中,以后不会有任何解密通过使用随机saltiv

这就是说你使用的encrypt函数可以让你传递你自己填写的encryption参数,包括saltiv ,但是把它们硬编码到一个固定的值(我想强烈指出) 不是 api的意图,滥用api。