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

Posted

技术标签:

【中文标题】使用 PHP mcrypt 加密后使用 Javascript CryptoJS 解密 AES【英文标题】:Decrypting AES with Javascript CryptoJS after encrypting with PHP mcrypt 【发布时间】:2014-12-24 18:27:05 【问题描述】:

在 PHP 中使用 mcrypt 加密

<?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='
?>

使用 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>

我不知道如何让 Javascript 端吐出原文。

【问题讨论】:

MCRYPT_RIJNDAEL_256 不是 AES; MCRYPT_RIJNDAEL_128 是。 谢谢,但是有没有办法在 javascript 中用 256 位块解密 RIJNDAEL 密码? 当然,找到一个 Rijndael javascript 实现。 谢谢。另外,当我将 php 中的块大小更改为 MCRYPT_RIJNDAEL_256 时,它仍然不起作用... 您的意思是上一条评论中的 MCRYPT_RIJNDAEL_128 吗?无论如何,mcrypt_encrypt 使用的填充与其他所有内容都不兼容,尤其是 Javascript 使用的 PKCS7 填充。请参阅 owlstead 的 answer in this question 了解更多信息。 【参考方案1】:

已解决

注意:我发现 PHP 的 mcrypt 中的“MCRYPT_RIJNDAEL_256”不包含在 AES 中。它使用 Rijndael 方法,但块大小为 256 位(不包括在 AES 中)。因此,CryptoJS 不处理 Rijndael 的 256 位块大小。谢谢,格雷格

尽管如此,我找到了一个实现,它使用 MCRYPT_RIJNDAEL_256(Rijndael,256 位块大小,256 位密钥/32-字节键)。

这里是: 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>

我希望这对某人有所帮助,因为我花了一周的空闲时间试图解决这个问题并几乎放弃了。

【讨论】:

它对我很有效。但解密后我得到了额外的空间。你能帮我解决这个问题吗? 只使用decrypted.replace(/\0/g, 'your replacement text');

以上是关于使用 PHP mcrypt 加密后使用 Javascript CryptoJS 解密 AES的主要内容,如果未能解决你的问题,请参考以下文章

使用php mcrypt加密解密

使用php mcrypt加密解密

PHP 使用 openssl 解密数据(使用 mcrypt 加密)

使用 mcrypt 在 php 和 c 中进行 AES 加密

使用 MCRYPT 在 PHP 中加密/解密...结果不一致

php使用内置的mcrypt_encrypt和mcrypt_decrypt进行字符串加密解密