Как расшифровать 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
).