我一直在尝试使用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
?
答案 0 :(得分:9)
CryptoJS&#39> <{em> issue 46中讨论了ArrayBuffer -> WordArray
的转换。出于这个原因,您还可以添加TypedWordArray
ArrayBuffer
。
使用它还包括以下脚本:
<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/lib-typedarrays.js"></script>
然后你就可以做到:
var wordArray = CryptoJS.lib.WordArray.create(arrayBuffer);
/* perform decryption of `wordArray` */
要将生成的decryptedWordArray
重新转换为ArrayBuffer
,最简单的方法可能是首先将其转换为Base64-String
(如所讨论的here)然后解码该字符串到期望的ArrayBuffer
(请参阅here)。整个过程看起来像这样:
dcWordArray = ... // your decrypted WordArray
dcBase64String = dcWordArray.toString(CryptoJS.enc.Base64); // to Base64-String
dcArrayBuffer = base64DecToArr(dcBase64String).buffer; // to ArrayBuffer
修改强>
要获得更有效的转化(不需要中间Base64String
),请查看 Aletheios 对that问题的答案(函数wordToByteArray(wordArray)
,然后执行{{1} }})。
答案 1 :(得分:-2)
您可以使用web crypto
API直接解密arrayBuffer。
无需将二进制数据转换为字符串,这样效率很低,并且可能导致内存和CPU上升。