一、php方面
1.需要开启openssl扩展
2.注:php 的 mcrypt_ 函数簇在 7.1.0 版本中开始 deprecated,并在 7.2.0 版本中彻底废弃。其实在 2015 就已经开始建议大家使用 openssl_encrypt/openssl_decrypt 来代替 mcrypt_encrypt/mcrypt_decrypt,缓冲了 N 久,这一天终于在 7.2.0 版本上到来了。
openssl_decrypt 的 OPENSSL_ZERO_PADDING默认会补零到16位
aes-128-cbc: 表示16位的
method 长度的问题,密码学方式我们用的最多的有两种,AES-128-CBC 与 AES-256-CBC
上节我们讲过字符串的长度问题
1 bit 位 = 1 二进制数据 1 byte 字节 = 8 bit 1 字母 = 1 byte = 8 bit 128位/8=16字节=16字符 192位/8=24字节=24字符 256位/8=32字节=32字符
也就是说KEY 的长度是根据AES-128-CBC 与 AES-256-CBC 变换的。使用 AES-128-CBC 时,key的长度应该为16位,使用 AES-256-CBC时,key的长度应该为32位。
封装的Aes示例:
class Aes
{
private $paddingChar = "\0";
private $key;
private $iv;
private $option = OPENSSL_ZERO_PADDING;
private $method = 'aes-128-cbc';
/**
* Aescrypt constructor.
*
* @param $key
* @param $iv
*/
public function __construct($key = 'nnNdYE3MftWm5gWn', $iv = '9mXW4f4fvgSFG0bt')
{
$this->key = $key;
$this->iv = $iv;
}
/**
* @param string $content
*
* @return string
* @desc aes-128加密
*/
public function encrypt($content)
{
$strLength = strlen($content);
$content .= str_repeat($this->paddingChar, 16 - $strLength % 16);
$data = openssl_encrypt($content, $this->method, $this->key, $this->option, $this->iv);
if (false === $data) {
echo openssl_error_string();
exit;
}
return $data;
}
/**
* @param string $encryptData
*
* @return string
* @desc aes-128解密
*/
public function decrypt($encryptData)
{
$data = openssl_decrypt($encryptData, $this->method, $this->key, $this->option, $this->iv);
return substr($data, 0, strpos($data, $this->paddingChar));
}
}
精简
public static function opensslDecrypt($data = '')
{
if (empty($data) || !is_string($data)) {
return $data;
}
$method = 'aes-128-cbc';
$privateKey = 'F79JF2tNdHLW4bid'; //todo
$iv = 'bk4h1mv84RCOdyn2'; //todo
$res = '';
if ($decrypt = openssl_decrypt($data, $method, $privateKey, OPENSSL_ZERO_PADDING, $iv)) {
$res = rtrim($decrypt, "\0");
// 或者 $cleaned = strval(str_replace("\0", "", $password));
}
return $res;
}
二、js方面
cryptojs:下载地址
https://code.google.com/archive/p/crypto-js/downloads
cryptojs:文档说明
CryptoJS - CryptoJS
cryptojs:在线调试工具
在线加密解密
<!-- 加密js-->
<script src="__STATIC__/common/js/crypto/rollups/aes.js"></script>
<script src="__STATIC__/common/js/crypto/components/pad-zeropadding.js"></script>
/**
* 加密
*/
function doEncrypt(data) {
if (data == '' || data == undefined) {
return data;
}
let key = CryptoJS.enc.Latin1.parse('F79JF2tNdHLW4bid');
let iv = CryptoJS.enc.Latin1.parse('bk4h1mv84RCOdyn2');
//加密
return CryptoJS.AES.encrypt(data, key, {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding});
}