1

我正在使用 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)
4

1 回答 1

1

不仅salt是使密文每次都不同的原因iv。但是这些都是提供语义安全的安全功能,您确实不应该禁用并且也不应该禁用,因为盐和 iv 可以包含在密文中,没有任何东西可以阻止您以后解密通过使用随机saltiv.

That said the encrypt function you are using lets you pass your own filled out parameters for the crypto including salt and iv, but to hard-code those to a fixed value (I would like to strongly point out) is not the api intention and an abuse of the api.

于 2012-12-12T16:53:00.253 回答