Как расшифровать ArrayBuffer?

Я пытался расшифровать объект ArrayBuffer с помощью CryptoJS, но до сих пор он всегда возвращает пустой WordArray. Файлы (изображения) шифруются в приложении iOS и Android, отправляются на сервер и загружаются в это веб-приложение для расшифровки и отображения. Приложения 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?

1 ответов


преобразование ArrayBuffer -> WordArray обсуждался в CryptoJS выпуск 46. По этой причине 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 (как обсуждалось здесь), а затем декодировать эту строку к желаемому ArrayBuffer (см. здесь). Вся процедура будет выглядеть примерно так:--18-->

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

Edit:

для более эффективного преобразования (без промежуточных Base64String необходимости) проверить Aletheios ответ это вопрос (функция wordToByteArray(wordArray) а потом сделай .buffer).