Расшифровка AES не работает с шифрованием. js - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь получить расшифрованные данные с помощью crypto- js, но получаю пустое значение. в то время как те же самые ключи работают в режиме онлайн и расшифровываются.

var CryptoJS = require("crypto-js"); 
var key = '+MbQeThVmYq3t6w9z$C&F)J@NcRfUjXn';
var iv = '5ty76ujie324$567';
var encdata = 'ad06c28a5c9d933bc73451f86fcaa69a';
cipher = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(encdata))
var decrypt = CryptoJS.AES.decrypt(cipher, Buffer.from(key), {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});

var ddd = decrypt.toString(CryptoJS.enc.Utf8);
console.log(ddd,"hey");

не в состоянии понять, почему он ведет себя так. но если я использую crypto, он работает с кодом ниже

var crypto = require("crypto");
 let encryptedText = Buffer.from(encdata, 'hex');
        let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(key), iv);
        let decrypted = decipher.update(encryptedText);
        decrypted = Buffer.concat([decrypted, decipher.final()]);
       console.log(decrypted.toString());

1 Ответ

1 голос
/ 10 января 2020

Ключ и IV должны передаваться как WordArray -объекты (а не как строки или NodeJS -буфер) [1] . Поскольку оба определены как UTF8-строки, они могут быть преобразованы в WordArray -объекты с соответствующим UTF8-кодером (CryptoJS.enc.Utf8.parse(...)) [2] :

var key = CryptoJS.enc.Utf8.parse('+MbQeThVmYq3t6w9z$C&F)J@NcRfUjXn');         // Key: Use a WordArray-object instead of a UTF8-string / NodeJS-buffer 
var iv = CryptoJS.enc.Utf8.parse('5ty76ujie324$567');                          // IV: Use a WordArray-object instead of a UTF8-string 
var encdata = 'ad06c28a5c9d933bc73451f86fcaa69a';
var cipher = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(encdata));   

var decrypt = CryptoJS.AES.decrypt(cipher, key, {
  iv: iv,
  mode: CryptoJS.mode.CBC,
  padding: CryptoJS.pad.Pkcs7
});

var decrypted = decrypt.toString(CryptoJS.enc.Utf8);
console.log(decrypted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>

Обратите внимание, что зашифрованный текст обычно передается как CipherParams -объект [1] . В качестве альтернативы, его можно передать в виде строки (как в этом примере), которая затем неявно * 10120 * преобразуется в CipherParams -объект с определяемой стратегией форматирования (по умолчанию ожидается строка в кодировке Base64) .

При дешифровании возвращается WordArray для преобразования в строку UTF8 [4] :

...