用Crypto.JS加密,用PHP7.3解密

用Crypto.JS加密,用PHP7.3解密,php,encryption,Php,Encryption,我正在将我的代码从PHP5.6升级到7.3,这是我的Ionic应用程序的Woocommerce插件。同时我注意到,在PHP7中,mcrypt_decrypt是不推荐使用的。我试图找出如何更改代码,但它仍然没有返回相同的字符串。以下是我在应用程序中的加密代码: var password = this.password; if (this.appConfig.App_Secret != '') { var key = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(th

我正在将我的代码从PHP5.6升级到7.3,这是我的Ionic应用程序的Woocommerce插件。同时我注意到,在PHP7中,mcrypt_decrypt是不推荐使用的。我试图找出如何更改代码,但它仍然没有返回相同的字符串。以下是我在应用程序中的加密代码:

var password = this.password;
if (this.appConfig.App_Secret != '') {
  var key = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(this.appConfig.App_Secret).toString());
  var iv = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(this.appConfig.App_Secret).toString().substr(0, 16));
  password = CryptoJS.AES.encrypt(password, key, { iv: iv }).toString();
}
这是我用PHP编写的旧解密代码:

$iv=substr(md5(get_option('sow_rest_api_secret')),0,16);
$key = md5(get_option('sow_rest_api_secret'));
$data = base64_decode($decrypt_str);
$result = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
return rtrim($result,"\0");
我用$result变量从

$result = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);

你能提供支持吗?

引用:

另外,MCRYPT_RIJNDAEL_256不是AES-256,它是RIJNDAEL分组密码的不同变体如果您希望在mcrypt中使用AES-256,则必须使用带有32字节密钥的mcrypt_RIJNDAEL_128。OpenSSL使您使用的模式更加明显(即“AES-128-cbc”与“AES-256-ctr”)

这意味着您以前使用过AES-256,而不是AES-128

此外,CryptoJS默认使用CBC模式,正如@Topaco正确指出的那样

综合起来:

$result = openssl_decrypt($data, 'aes-256-cbc', $key, $options=OPENSSL_RAW_DATA, $iv);
应给出与您以前的
mcrypt\u decrypt
解决方案相同的结果。

CryptoJS默认使用CBC模式,即,为了成功解密,需要将
aes-256-CBC
作为算法/模式(这就是为什么在不推荐的代码中指定了
mcrypt\u mode\u CBC
)。如果
rtrim($result,“\0”)
用于删除零填充,这是不必要的,因为CryptoJS和
openssl_decrypt
默认情况下都使用PKCS7填充,而取消填充是隐式完成的。
$result = openssl_decrypt($data, 'aes-256-cbc', $key, $options=OPENSSL_RAW_DATA, $iv);