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