当PassPhrase相同时,需要SJCL制作相同的加密AES 256输出

时间:2012-12-12 14:08:17

标签: javascript node.js file-upload cryptography aes

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

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

经过一些研究后我发现这是因为盐每次都是随机的,我需要做一个'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)

1 个答案:

答案 0 :(得分:1)

salt不仅仅是iv,每次salt时都会使密文不同。但这些都是安全功能,提供了你真正不应该禁用的语义安全性,也不需要禁用,因为salt和iv可以包含在密文中,没有任何东西阻止你以后解密使用随机ivencrypt

那就是说你正在使用的salt功能允许你传递自己填写的加密参数,包括iv和{{1}},但要将这些参数硬编码为固定值(我想强烈指出) api意图和滥用api。