使用 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 使用 openssl 解密数据(使用 mcrypt 加密)
使用 mcrypt 在 php 和 c 中进行 AES 加密