如何解密ArrayBuffer?

jjv*_*360 8 javascript encryption arraybuffer cryptojs

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

}
Run Code Online (Sandbox Code Playgroud)

我的另一个问题是你如何将a转换WordArray为ArrayBuffer?

i_t*_*uro 10

ArrayBuffer -> WordArray已经在CryptoJS的 第46 期中讨论了转换.出于这个原因TypedWordArray,你还可以通过一个地方ArrayBuffer.


要使用它还包括以下脚本:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/lib-typedarrays.js"></script>
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地做:

var wordArray = CryptoJS.lib.WordArray.create(arrayBuffer);

/* perform decryption of `wordArray` */
Run Code Online (Sandbox Code Playgroud)

重新转换所产生的decryptedWordArray一个ArrayBuffer,最简单的方法很可能是,首先将其转换为一个Base64-String(如讨论这里),然后解码该字符串所需ArrayBuffer(见这里).整个过程看起来像这样:

dcWordArray = ... // your decrypted WordArray
dcBase64String = dcWordArray.toString(CryptoJS.enc.Base64); // to Base64-String
dcArrayBuffer = base64DecToArr(dcBase64String).buffer; // to ArrayBuffer
Run Code Online (Sandbox Code Playgroud)

编辑:

为了更有效地转换(无中间Base64String需要)检查Aletheios答案是问题(函数wordToByteArray(wordArray),然后做.buffer).