AES在php中加密,然后使用Javascript(cryptojs)解密

AES在php中加密,然后使用Javascript(cryptojs)解密,php,javascript,encryption,mcrypt,cryptojs,Php,Javascript,Encryption,Mcrypt,Cryptojs,我正在寻找一种对简单文本(5到6个数字和/或字符)进行双向加密的方法。问题是我想用php进行加密,然后通过Javascript对其进行解密。对于php,我已经使用mcrypt_encode进行了测试,并且已经使其工作,因此当我尝试使用javascript(我使用的是Crypto js库)对其进行解密时,我没有得到任何结果。下面是我正在使用的php代码: $key = "oijhd981727783hy18274"; $text = "1233"; $td = mcrypt_module_open

我正在寻找一种对简单文本(5到6个数字和/或字符)进行双向加密的方法。问题是我想用php进行加密,然后通过Javascript对其进行解密。对于php,我已经使用mcrypt_encode进行了测试,并且已经使其工作,因此当我尝试使用javascript(我使用的是Crypto js库)对其进行解密时,我没有得到任何结果。下面是我正在使用的php代码:

$key = "oijhd981727783hy18274";
$text = "1233";
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC,$iv);
echo base64_encode($crypttext);
var encrypted = CryptoJS.enc.Base64.parse("LiJU5oYHXRSNsrjMtCr5o2ev7yDFGZId85gh9MEXPeg=");
var key = 'oijhd981727783hy18274';
var decrypted = CryptoJS.AES.decrypt(encrypted, key);
document.write( decrypted.toString(CryptoJS.enc.Utf8) );
下面是我正在使用的Javascript代码:

$key = "oijhd981727783hy18274";
$text = "1233";
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC,$iv);
echo base64_encode($crypttext);
var encrypted = CryptoJS.enc.Base64.parse("LiJU5oYHXRSNsrjMtCr5o2ev7yDFGZId85gh9MEXPeg=");
var key = 'oijhd981727783hy18274';
var decrypted = CryptoJS.AES.decrypt(encrypted, key);
document.write( decrypted.toString(CryptoJS.enc.Utf8) );
因为我只是在测试,所以我将php的输出直接复制/粘贴到JS中,看看它是否会返回任何结果,但这不会发生。因为我对加密/解密部分还不熟悉,所以我可能遗漏了一些东西。如有任何建议,将不胜感激


另一方面,我在这里读到了很多关于使用其他类型的通信来传输数据的建议,在这种情况下,这是不可能的,因为我需要将此字符串传递给第三方软件,该软件将把它带到一个安全区域,在那里我只能编辑javascript,这就是为什么我试图用php加密文本,并将其放在网站的源代码中,第三方软件将在加密后读取文本,并将其传输到安全部分,在安全部分,我需要通过Javascript将其解密回来(我无法访问那里的php)。

不久前,我遇到了同样的问题。我终于从中使用了SlowAES并进行了一些修复,并将其移植到PHP

注意:官方的源代码是不完整的,就像官方的PHP端口一样


如果你有兴趣,请告诉我。然后我会在GitHub上打开一个新的存储库,在那里你可以获取你需要的一切…

因此,在进一步挖掘之后,我来到了下面的在线站点,这让我找到了存储库

在第一个链接上的一条评论中,我发现这个JS库有一个php等价物,它似乎工作得相当好,并且很容易部署:


因此,感谢Lars提供的答案,我鼓励他打开存储库,我相信他会让某人的生活更轻松:)

来自CryptoJS文档:

对于密钥,当您传递字符串时,它被视为密码短语,用于派生实际密钥和IV。或者您可以传递表示实际密钥的WordArray。如果您传递了实际的密钥,则还必须传递实际的IV

那么在你的队伍里

var decrypted = CryptoJS.AES.decrypt(encrypted, key);
“OIJHD98172783HY18274”被视为创建密钥的密码短语,而不是实际密钥

通过IV的工作原理如下:

var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
var iv  = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');

var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });

可能想打败用湿鱼设置此过程的客户,直到他们同意在整个过程中实现SSL。我看不到您将IV预先设置为密文。您的库是否自动执行此操作?如果不是,那很可能是您的问题的原因。您的意思是我应该:
echo base64_encode($iv.$crypttext)?谢谢Lars,但是在我打开这个问题并找到一个有效的解决方案之后,我仍然继续挖掘。。。检查下面的答案。对我来说,答案在上面,但没关系。得到一个很好解决的问题很重要;)!谢谢,在浪费了很多时间,尝试了各种LIB之后,你的解决方案帮助了我!