Javascript AES-256-CBC Mcrypt PHP解密和加密JS加密

Javascript AES-256-CBC Mcrypt PHP解密和加密JS加密,javascript,php,encryption,aes,cryptojs,Javascript,Php,Encryption,Aes,Cryptojs,我正在尝试用CryptoJS用Javascript加密,用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('101112131415

我正在尝试用CryptoJS用Javascript加密,用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);  
这不会返回正确答案

我不确定事情进展得如何糟糕!我需要自己做静脉注射,但如果我说:

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代码中成功地工作了——只有密钥_base64是不能更改的,它必须是用户记住的。。。然后它给了我一个盐,让我从输入的密码短语中获得一个密钥,并询问它是如何使用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>

var salt=CryptoJS.lib.WordArray.random(128/8);
var key256bit500iterations=CryptoJS.PBKDF2(“秘密密码短语”,salt,{keySize:256/32,iterations:500});
var iv=CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');//只是选择了一个例子,通常也是随机的
var encrypted=CryptoJS.AES.encrypt(“Message”,key256bit500iterations,{iv:iv});
var data_base64=encrypted.ciphertext.toString(CryptoJS.enc.base64);
var iv_base64=加密的.iv.toString(CryptoJS.enc.base64);
var key_base64=encrypted.key.toString(CryptoJS.enc.base64);
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 " );

这让我很生气=[虽然我将
\r\n
添加到要修剪PHP的字符列表中,但仍然有效-side@Shuric我有一个使用cryptoJS的项目。它是带有cordova的客户机-服务器移动应用程序。我以前在客户端使用cryptoJS进行加密和解密,因为我只需要sqlite数据无法读取。但我需要在服务器端加密数据以使其生效通过互联网传输时无法读取。因此我认为这与你的答案相反。所以你能帮我解决它吗。老实说,我仍然不理解aes加密,我只是在加密和解密中使用密码短语。我不知道iv和salt是什么。提前感谢。