AES-256-CBC Mcrypt-PHP расшифровка и шифрование Crypto-JS

Я пытаюсь зашифровать в Javascript с помощью CryptoJS и расшифровать в PHP. Код JS:

var salt = CryptoJS.lib.WordArray.random(128/8); var key256Bits500Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32, iterations: 500 }); var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); // just chosen for an example, usually random as well encrypted = CryptoJS.AES.encrypt("Message", key512Bits1000Iterations, { iv: iv }); var data_base64 = crypted.ciphertext.toString(CryptoJS.enc.Base64); var iv_base64 = crypted.iv.toString(CryptoJS.enc.Base64); var key_base64 = crypted.key.toString(CryptoJS.enc.Base64); 

И PHP выглядит следующим образом:

 $encrypted = base64_decode($data_base64); $iv = base64_decode($iv_base64); $key = base64_decode($key_base64); $plaintext = mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv); echo ($plaintext); 

Это не возвращает правильный ответ.

Я не уверен, где все идет плохо! Мне нужно сделать свой собственный IV, но если я просто скажу:

 CryptoJS.AES.Encrypt("Message", "Secret Passphrase"); var data_base64 = crypted.ciphertext.toString(CryptoJS.enc.Base64); var iv_base64 = crypted.iv.toString(CryptoJS.enc.Base64); var key_base64 = crypted.key.toString(CryptoJS.enc.Base64); 

Он успешно работает в PHP-коде – только key_base64 не является чем-то, что можно изменить, это должно быть то, что пользователь помнит … И тогда он дает мне соль, чтобы получить ключ от введенной парольной фразы и IDK как это удалось получить, используя CryptoJS

Ваш код будет работать, если вы просто исправите несколько опечаток

JS

  <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script> <script> var salt = CryptoJS.lib.WordArray.random(128/8); var key256Bits500Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32, iterations: 500 }); var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); // just chosen for an example, usually random as well var encrypted = CryptoJS.AES.encrypt("Message", key256Bits500Iterations, { iv: iv }); var data_base64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64); var iv_base64 = encrypted.iv.toString(CryptoJS.enc.Base64); var key_base64 = encrypted.key.toString(CryptoJS.enc.Base64); </script> 

PHP

  <?php $encrypted = base64_decode("data_base64"); // data_base64 from JS $iv = base64_decode("iv_base64"); // iv_base64 from JS $key = base64_decode("key_base64"); // key_base64 from JS $plaintext = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv ), "\t\0 " );