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

Posted

技术标签:

【中文标题】php中的AES加密,然后用Javascript(cryptojs)解密【英文标题】:AES encryption in php and then decryption with Javascript (cryptojs) 【发布时间】:2012-08-01 14:12:02 【问题描述】:

我正在寻找一种方法来对简单文本(5 到 6 个数字和/或字符)进行 2 路加密。问题是我想在 php 中进行加密,然后通过 javascript 对其进行解密。对于 php,我已经使用 mcrypt_encode 进行了测试并且已经让它工作,因此当我尝试用 javascript 解密它时(我正在使用 Crypto-js 库 - http://code.google.com/p/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);

然后这是我正在使用的 Javascript 代码:

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)。

【问题讨论】:

可能想打败那些用湿鱼设置此过程的客户,直到他们同意在整个过程中实施 SSL。 我没有看到您将 IV 附加到密文中。您的图书馆会自动执行此操作吗?如果不是,这可能是您的问题的原因。 你的意思是我应该有:echo base64_encode($iv.$crypttext); 这能回答你的问题吗? Encrypt in PHP openssl and decrypt in javascript CryptoJS 【参考方案1】:

所以,经过更多挖掘后,我来到了以下在线 encryptor/decryptor,这将我带到了 gibberish-aes at GitHub 存储库。

在第一个链接上的一个 cmets 中,我发现这个 JS 库有一个 php 等价物,它似乎工作得相当好并且相当容易部署: https://github.com/ivantcholakov/gibberish-aes-php

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

【讨论】:

谢谢,浪费了很多时间,尝试了各种库,你的解决方案帮助了我!【参考方案2】:

来自 CryptoJS 文档:

对于密钥,当您传递一个字符串时,它会被视为密码并用于派生实际密钥和 IV。或者您可以传递一个代表实际键的 WordArray。如果传递实际密钥,则还必须传递实际 IV。

所以在你的行中

var decrypted = CryptoJS.AES.decrypt(encrypted, key);

“oijhd981727783hy18274”被视为创建密钥的密码,而不是实际密钥。

通过 IV 的工作方式如下:

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

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

【讨论】:

【参考方案3】:

前段时间我遇到了同样的问题。我终于可以使用来自http://code.google.com/p/slowaes/ 的 SlowAES 并进行一些修复并将其移植到 PHP。

注意:官方来源已损坏,与官方PHP移植一样。

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

【讨论】:

谢谢拉尔斯,但是在我打开这个问题并找到一个可行的解决方案之后我继续挖掘......检查下面的答案。 上面对我来说,但没关系。得到一个很好解决的问题很重要;)!

以上是关于php中的AES加密,然后用Javascript(cryptojs)解密的主要内容,如果未能解决你的问题,请参考以下文章

java加密用PHP解密

AES加密使用Php,javascript,反之亦然

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

javascript与php使用aes进行加密/解密

JS实现AES加密并与PHP互通的方法分析

javascript 与 PHP 通信加密,使用AES 128 CBC no padding,以及ios,java,c#文章例子