簡體   English   中英

使用 Crypto.JS 加密並使用 PHP 7.3 解密

[英]Encrypt with Crypto.JS and decrypt with PHP 7.3

我正在將我的代碼從 PHP 5.6 升級到 7.3,這是我的 Ionic 應用程序的 Woocommerce 插件。 與此同時,我注意到 mcrypt_decrypt 在 PHP 7 中已棄用。我試圖弄清楚如何更改我的代碼,但它仍然沒有返回相同的字符串。 這是我在應用程序中的加密代碼:

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

$result = openssl_decrypt($data, 'aes-128-gcm', $key, $options=OPENSSL_RAW_DATA, $iv);

可以給予支持嗎?

引用這個 php.net 評論

此外,MCRYPT_RIJNDAEL_256 不是 AES-256,它是 Rijndael 分組密碼的不同變體。 如果您想在 mcrypt 中使用 AES-256,則必須使用 MCRYPT_RIJNDAEL_128 和 32 字節密鑰。 OpenSSL 使您使用的模式更加明顯(即“aes-128-cbc”與“aes-256-ctr”)。

這意味着您之前一直在使用 AES-256,而不是 AES-128。

此外,正如@Topaco 正確指出的那樣,CryptoJS 默認使用 CBC 模式。

把它放在一起:

$result = openssl_decrypt($data, 'aes-256-cbc', $key, $options=OPENSSL_RAW_DATA, $iv);

應該給出與您之前的mcrypt_decrypt解決方案相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM