如何解密ArrayBuffer?

时间:2014-08-29 11:34:32

标签: javascript encryption cryptojs arraybuffer

我一直在尝试使用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

2 个答案:

答案 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上升。