1

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

1 に答える 1

1

salt暗号文が毎回異なるのは、だけではありませivん。しかし、これらはどちらもセマンティック セキュリティを提供するセキュリティ機能であり、実際には無効にすべきではなく、無効にする必要もありません。なぜなら、salt と iv を暗号テキストに含めることができるため、後で復号化することを妨げるものは何もないからです。ランダムsaltまたはを使用してiv

つまり、使用している関数を使用すると、およびencryptを含む暗号化用に独自の入力済みパラメーターを渡すことができますが、それらを固定値にハードコーディングすること (強く指摘したい) は、API の意図や悪用ではありません。 API。saltiv

于 2012-12-12T16:53:00.253 に答える