基于PHP7和JS的AES相互加密解密方法详解2
综述
在18年的时候写了一篇《基于PHP和JS的AES相互加密解密方法详解(CryptoJS)》,上面详细描述了如何使用PHP和JS对数据进行相互的AES加密解密。
由于当初使用的是PHP5中的mcrypt_decrypt
和mcrypt_encrypt
方法,在PHP7中已经废弃了。故写本篇文章进行更新在PHP7中如何与JS进行相互的AES加密解密。
openssl加密解密
使用的是php5.*之前的mcrypt_decrypt
和mcrypt_encrypt
函数,这两个函数已经在php7.1后弃用了,进行替代的是openssl的openssl_encrypt
和openssl_decrypt
;在使用这两个函数时切记一定要打开openssl
扩展。
代码调整
具体的代码可去demo中进行下载“基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_PHP_JS_AES源码”。下面进贴出所修改地方的代码文件。
php代码修改部分(index.php)
<?php
/**
* ===============================================
* Created by ZHIHUA·WEI.
* Author: ZHIHUA·WEI <zhihua_wei@foxmail.com>
* Date: 2020/01/09 17:40
* Project: 基于PHP7和JS的AES相互加密解密方法详解2(CryptoJS)
* Power: php code
* ===============================================
// 仅对下述的两个集成加密解密方法函数代码进行了修改,下载后进行替换源码即可
//******************************集成函数********************************
/**
* 加密字符串
* @param string $data 字符串
* @param string $key 加密key
* @param string $iv 加密向量
* @return string
*/
function encrypt($data, $key, $iv)
{
$encrypted = openssl_encrypt($data, "AES-128-CBC", $key, true, $iv);
return base64_encode($encrypted);
}
/**
* 解密字符串
* @param string $data 字符串
* @param string $key 加密key
* @param string $iv 加密向量
* @return object
*/
function decrypt($data, $key, $iv)
{
$decrypted = openssl_decrypt(base64_decode($data), 'AES-128-CBC', $key, true, $iv);
$json_str = rtrim($decrypted, "\0");
return json_decode($json_str);
}
JS部分代码(funciton.js)
/**
* ===============================================
* Created by ZHIHUA·WEI.
* Author: ZHIHUA·WEI <zhihua_wei@foxmail.com>
* Date: 2020/01/09 17:50
* Project: 基于PHP7和JS的AES相互加密解密方法详解2(CryptoJS)
* Power: Javascript common function
* ===============================================
*/
/**
* 接口数据加密函数
* @param str string 需加密的json字符串
* @param key string 加密key(16位)
* @param iv string 加密向量(16位)
* @return string 加密密文字符串
*/
function encrypt(str, key, iv) {
//密钥16位
var key = CryptoJS.enc.Utf8.parse(key);
//加密向量16位
var iv = CryptoJS.enc.Utf8.parse(iv);
var encrypted = CryptoJS.AES.encrypt(str, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted;
}
/**
* 接口数据解密函数
* @param str string 已加密密文
* @param key string 加密key(16位)
* @param iv string 加密向量(16位)
* @returns {*|string} 解密之后的json字符串
*/
function decrypt(str, key, iv) {
//密钥16位
var key = CryptoJS.enc.Utf8.parse(key);
//加密向量16位
var iv = CryptoJS.enc.Utf8.parse(iv);
var decrypted = CryptoJS.AES.decrypt(str, key, {
iv: iv,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
return decrypted;
}