我一直在尝试使用CryptoJS解密一个ArrayBuffer对象,但是到目前为止它总是返回一个空的WordArray。这些文件(图片)被加密在iOS和Android应用中,发送到服务器,在这个Web应用程序中下载并进行解密显示。iOS和Android应用能够无问题地解密这些文件,因此加密过程没有问题。
文件通过XMLHttpRequest
使用responseType
设置为arraybuffer
进行下载。以下是我的代码:
// Decrypt a Base64 encrypted string (this works perfectly)
String.prototype.aesDecrypt = function(key) {
var nkey = CryptoJS.enc.Hex.parse(key.sha256());
return CryptoJS.AES.decrypt(this.toString(), nkey, {
iv: CryptoJS.enc.Hex.parse('00000000000000000000000000000000'),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
}
// Decrypt a plain encrypted ArrayBuffer (this is the problem, it always outputs an empty WordArray)
ArrayBuffer.prototype.aesDecrypt = function(key) {
// Get key
if (!key) return null;
var nkey = CryptoJS.enc.Hex.parse(key.sha256());
// Get input (if I pass the ArrayBuffer directly to the create function, it returns
// a WordList with sigBytes set to NaN)
//var input = CryptoJS.lib.WordArray.create(this);
var input = CryptoJS.lib.WordArray.create(new Uint8Array(this));
// Decrypt
var output = CryptoJS.AES.decrypt(input, nkey, {
iv: CryptoJS.enc.Hex.parse('00000000000000000000000000000000'),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// Output is an empty WordList
console.log("Output: ", output);
}
我还有一个问题是如何将 WordArray
转换为 ArrayBuffer
?
sigBytes
只有在使用signature/MAC
时才很重要,而根据您的工作中的 String-encryption-example,您并没有使用它。如果您的文件那么大,那可能真的会成为一个问题,我会尝试找到更好的解决方案。您能否提供一些测试数据(加密的ArrayBuffer
(如果可能的话是小的)+key
+IV
),这样我就可以自己尝试解密。谢谢。 - i_turoCryptoJS
由于某些原因只能解密Base64
字符串。(参见这个类似的问题)可能最简单的解决方案是:ArrayBuffer
->String
->decrypt()
->ArrayBuffer
。我稍后会使用这些信息更新我的答案 :) - i_turo