用PHP mcrypt加密后用Javascript CryptoJS解密AES

Jos*_*hih 2 javascript encryption aes mcrypt cryptojs

使用mcrypt在PHP中加密

<?php
$string = 'Secret Message';
$key = 'd4b494e4502a62edd695a903a94c2701';
$iv = '02f30dffbb0d084755f438f7d8be4a7d';

$encrypted = base64_encode(
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_256,
        $key,
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);
//$encrypted results in 'nYoFAiyDARVSI09lH/IPdim5TvE51izVjk6sc2AK9Rg='
?>
Run Code Online (Sandbox Code Playgroud)

使用CryptoJS在Javascript中解密

<script>
var encrypted = 'nYoFAiyDARVSI09lH/IPdim5TvE51izVjk6sc2AK9Rg=';
var key = CryptoJS.enc.Hex.parse('d4b494e4502a62edd695a903a94c2701');
var iv = CryptoJS.enc.Hex.parse('02f30dffbb0d084755f438f7d8be4a7d');

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

console.log(decrypted.toString(CryptoJS.enc.Utf8)); //prints an empty string
</script>
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何让Javascript端吐出原始文本.

Jos*_*hih 6

解决了

注意:我发现PHP的mcrypt中的"MCRYPT_RIJNDAEL_256"不包含在AES中.它使用Rijndael方法,BUT具有256位块大小(不包括在AES中).因此,CryptoJS不能处理Rijndael的256位块大小.谢谢,GregS

尽管如此,我发现了一个实现,它使用MCRYPT_RIJNDAEL_256(Rijndael,256位块大小,256位密钥/ 32字节密钥)成功解密上面运行我的PHP mcrypt函数得到的密文.

这是:https: //code.google.com/p/js-mcrypt/

<script>
var encrypted = 'nYoFAiyDARVSI09lH/IPdim5TvE51izVjk6sc2AK9Rg=';
var key = 'd4b494e4502a62edd695a903a94c2701';
var iv = '02f30dffbb0d084755f438f7d8be4a7d';
var decrypted = mcrypt.Decrypt(atob(encrypted), iv, key, 'rijndael-256', 'cbc');
</script>
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人,因为我花了一个星期的业余时间试图解决这个问题并且几乎放弃了.

  • 只需使用`decrypted.replace(/\0/g,'替换文本');` (2认同)