Как я могу расшифровать зашифрованную строку, такую ​​как dIwykUwOomuWcdw/QX/Aig== в режиме AES 256 CBC, с ключом ds8am3wys3pd75nf0ggtvajw2k3uny92 и iv jm8lgqa3j1d0ajus как jm8lgqa3j1d0ajus ниже, только с javascript (не с JavaScript). Я пытался использовать библиотеку CryptoJs, но результат не такой, как я ожидал.

введите описание изображения здесь

 {amp}lt;script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"{amp}gt;{amp}lt;/script{amp}gt; {amp}lt;script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/pbkdf2.js"{amp}gt;{amp}lt;/script{amp}gt; {amp}lt;script{amp}gt; var str = 'dIwykUwOomuWcdw/QX/Aig=='; var key = 'ds8am3wys3pd75nf0ggtvajw2k3uny92'; var iv = 'jm8lgqa3j1d0ajus'; var encrypted = CryptoJS.AES.encrypt("2730007809303", key, { iv: iv }); var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv}); var base64_str = decrypted.toString(CryptoJS.enc.Base64); console.log(atob(base64_str)) {amp}lt;/script{amp}gt; 

Кстати, как я могу преобразовать входную строку dIwykUwOomuWcdw/QX/Aig== как encrypted объект выше?

Ваш фрагмент кода почти прав. Однако ключ не должен передаваться как строка, иначе CryptoJS интерпретирует его как фразу-пароль и сгенерирует фактический ключ и IV из него [1] , кстати, с небезопасным алгоритмом. Вместо этого ключ и IV должны быть переданы как WordArray , что легко достигается с помощью кодировщиков [2] . Поскольку ключ и IV в этом примере являются Utf8-строками, они должны быть проанализированы с помощью Utf8-кодировщика. Затем вы получите желаемый зашифрованный текст веб-страницы. Имейте в CipherParams что encrypt возвращает CipherParams CipherParams, который инкапсулирует зашифрованный текст среди других данных [3] . Кроме того, вам не нужен обход Base64, и вы должны декодировать дешифрованные данные непосредственно в виде строки UTF8:

 {amp}lt;script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"{amp}gt;{amp}lt;/script{amp}gt; {amp}lt;script type="text/javascript"{amp}gt; var key = CryptoJS.enc.Utf8.parse('ds8am3wys3pd75nf0ggtvajw2k3uny92'); // Use Utf8-Encoder. var iv = CryptoJS.enc.Utf8.parse('jm8lgqa3j1d0ajus'); // Use Utf8-Encoder var encryptedCP = CryptoJS.AES.encrypt("2730007809303", key, { iv: iv }); var decryptedWA = CryptoJS.AES.decrypt(encryptedCP, key, { iv: iv}); var encryptedBase64 = encryptedCP.toString(); // Short for: encryptedCP.ciphertext.toString(CryptoJS.enc.Base64); var decryptedUtf8 = decryptedWA.toString(CryptoJS.enc.Utf8); // Avoid the Base64 detour. // Alternatively: CryptoJS.enc.Utf8.stringify(decryptedWA); console.log("Ciphertext (Base64) : "   encryptedBase64) console.log("Decrypted data (Utf8): "   decryptedUtf8); // Output: // Ciphertext (Base64) : dIwykUwOomuWcdw/QX/Aig== // Decrypted data (Utf8): 2730007809303 {amp}lt;/script{amp}gt; 

Обратите внимание, что неявно используются CBC-mode и PKCS7-padding, которые являются параметрами по умолчанию для CryptoJS [4] , поэтому нет необходимости указывать их явно.

Обновить:

Если зашифрованный текст является строкой или WordArray , из CipherParams должен быть создан CipherParams CipherParams, потому что метод decrypt ожидает объект этого типа [5] . CipherParams всех данных, инкапсулированных CipherParams CipherParams, CipherParams извлечь из его определения [6] . В текущем случае, по крайней мере, зашифрованный текст должен быть указан как WordArray . При желании можно указать средство форматирования, которое определяет стратегию форматирования toString() (если используется). Чтобы проверить это, используйте приведенный выше фрагмент кода и замените

  var encryptedCP = CryptoJS.AES.encrypt("2730007809303", key, { iv: iv }); 

с

  var ciphertext = CryptoJS.enc.Base64.parse('dIwykUwOomuWcdw/QX/Aig=='); // Use Base64-Encoder. var encryptedCP = CryptoJS.lib.CipherParams.create({ ciphertext: ciphertext, formatter: CryptoJS.format.OpenSSL // Optional, but required for shortcut encryptedCP.toString() });