用PHP加密解密加密AES加密AES加密 [英] Decrypting AES with Javascript CryptoJS after encrypting with PHP mcrypt
问题描述
使用mcrypt加密PHP
<?php
$ string = 秘密消息;
$ key ='d4b494e4502a62edd695a903a94c2701';
$ iv ='02f30dffbb0d084755f438f7d8be4a7d';
$ encrypted = base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
$ key,
$ string,
MCRYPT_MODE_CBC,
$ iv
)
);
// $加密结果'nYoFAiyDARVSI09lH / IPdim5TvE51izVjk6sc2AK9Rg ='
?>
使用CryptoJS解压缩JavaScript
< script>
var encrypted ='nYoFAiyDARVSI09lH / IPdim5TvE51izVjk6sc2AK9Rg =';
var key = CryptoJS.enc.Hex.parse('d4b494e4502a62edd695a903a94c2701');
var iv = CryptoJS.enc.Hex.parse('02f30dffbb0d084755f438f7d8be4a7d');
var decryptpted = CryptoJS.AES.decrypt(encrypted,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});
console.log(decryptpted.toString(CryptoJS.enc.Utf8)); //打印一个空字符串
< / script>
我不知道如何让Javascript一边吐出原文
SOLVED
注意:我发现在PHP的mcrypt中的MCRYPT_RIJNDAEL_256不包括在AES中。它使用Rijndael方法,BUT具有256位块大小(AES中不包括)。因此,CryptoJS不处理Rijndael的256位块大小。谢谢,GregS
尽管如此,我发现一个成功解密我从运行我的PHP mcrypt函数获取的密文的实现,使用MCRYPT_RIJNDAEL_256(Rijndael,256位块大小,256位密钥/ 32字节密钥)。
这里是:
< a href =https://code.google.com/p/js-mcrypt/ =noreferrer> https://code.google.com/p/js-mcrypt/
< script>
var encrypted ='nYoFAiyDARVSI09lH / IPdim5TvE51izVjk6sc2AK9Rg =';
var key ='d4b494e4502a62edd695a903a94c2701';
var iv ='02f30dffbb0d084755f438f7d8be4a7d';
var decryptpted = mcrypt.Decrypt(atob(encrypted),iv,key,'rijndael-256','cbc');
< / script>
我希望这有助于我花了一个星期的业余时间试图弄清楚这一点,几乎放弃。
Encrypting in PHP with 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='
?>
Decrypting in Javascript with CryptoJS
<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>
I can't figure out how to get the Javascript side to spit out the original text.
SOLVED
Note: I found out that "MCRYPT_RIJNDAEL_256" in PHP's mcrypt is NOT included in AES. It uses the Rijndael method, BUT with a 256-bit block size (not included in AES). So, CryptoJS does not handle 256-bit block sizes for Rijndael. Thanks, GregS
Nonetheless, I found an implementation that successfully decrypted the ciphertext I get from running my PHP mcrypt function above, using MCRYPT_RIJNDAEL_256 (Rijndael, 256-bit block size, with 256-bit key/32-byte key).
Here it is: 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>
I hope this helps someone as I spent a week of my spare time trying to figure this out and almost giving up.
这篇关于用PHP加密解密加密AES加密AES加密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!