PHP实现的AES加密、解密封装类与用法示例


Posted in PHP onAugust 02, 2018

本文实例讲述了PHP实现的AES加密、解密封装类与用法。分享给大家供大家参考,具体如下:

<?php
/**
 * Class AES
 * 用于AES加解密数据
 * time:2018-04-27
 */
class AES
{
  protected $cipher = MCRYPT_RIJNDAEL_256; //AES加密算法
  protected $mode = MCRYPT_MODE_CBC; //采用cbc加密模式
  protected $key; //密钥
  protected $iv; //cbc模式加密向量,如为空将采用密钥代替
  /**
   * AES constructor.
   *
   * @param   $key 密钥
   * @param null $iv 向量 可选 如为空将采用密钥代替
   *
   * @throws Exception
   */
  public function __construct($key, $iv = NULL)
  {
    if (!extension_loaded("mcrypt")) {
//      throw new \Exception("mcrypt extension do not exist. it was DEPRECATED in PHP 7.1.0, and REMOVED in PHP 7.2.0. use OpenSSL instead");
    }
    $this->key = $key;
    $this->iv = $iv;
  }
  /**
   * 加密数据
   * @param $data
   *
   * @return string
   */
  public function encrypt($data)
  {
    $td = mcrypt_module_open($this->cipher, '', $this->mode, '');
    $key = hash("sha256", $this->key, true);
    $iv = isset($this->iv) ? hash("sha256", $this->iv, true) : $key;
    $data = $this->padding($data);
    mcrypt_generic_init($td, $key, $iv);
    $encryptedData = base64_encode(mcrypt_generic($td, $data));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $encryptedData;
  }
  /**
   * 解密数据
   * @param $data
   *
   * @return bool|string
   */
  public function decrypt($data)
  {
    $td = mcrypt_module_open($this->cipher, '', $this->mode, '');
    $key = hash("sha256", $this->key, true);
    $iv = isset($this->iv) ? hash("sha256", $this->iv, true) : $key;
    mcrypt_generic_init($td, $key, $iv);
    $decrypted_data = mdecrypt_generic($td, base64_decode($data));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $this->unPadding($decrypted_data);
  }
  /**
   * 填充数据到分组大小的整数倍
   * @param null $data
   *
   * @return string
   */
  protected function padding($data = null)
  {
    $blockSize = 32; //MCRYPT_RIJNDAEL_256算法的分组大小是32字节
    $pad = $blockSize - (strlen($data) % $blockSize);
    return $data . str_repeat(chr($pad), $pad);
  }
  /**
   * 去掉填充的数据
   * @param null $data
   *
   * @return bool|string
   */
  protected function unPadding($data = null)
  {
    $pad = ord($data[strlen($data) - 1]);
    if ($pad > strlen($data)) {
      return false;
    }
    if (strspn($data, chr($pad), strlen($data) - $pad) != $pad) {
      return false;
    }
    return substr($data, 0, -1 * $pad);
  }
  /**
   * @return mixed
   */
  public function getSecretKey()
  {
    return $this->key;
  }
  /**
   * @param mixed $key
   */
  public function setSecretKey($key)
  {
    $this->key = $key;
  }
  /**
   * @return null
   */
  public function getIv()
  {
    return $this->iv;
  }
  /**
   * @param null $iv
   */
  public function setIv($iv)
  {
    $this->iv = $iv;
  }
}
//使用方法:
$keyStr = 'sq8f77fwhksk';
$aes = new AES($keyStr);
$str = '3water.com';
$chgstr = $aes->encrypt($str);
echo $chgstr;
echo "<br/>";
$rstr = $aes->decrypt($chgstr);
echo $rstr;
?>

运行结果:

pDyiRRNaxlss2b6SgoiVPdkD2m1QWhX393lh2iFgGdY=
3water.com

PHP 相关文章推荐
使用apache模块rewrite_module (转)
Feb 14 PHP
php数组应用之比较两个时间的相减排序
Aug 18 PHP
PHP开发中常用的8个小技巧
Aug 27 PHP
PHP漏洞全解(详细介绍)
Nov 13 PHP
php获取bing每日壁纸示例分享
Feb 25 PHP
php设置允许大文件上传示例代码
Mar 10 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
php自动给网址加上链接的方法
Jun 02 PHP
PHP版单点登陆实现方案的实例
Nov 17 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
Laravel使用支付宝进行支付的示例代码
Aug 16 PHP
基于php双引号中访问数组元素报错的解决方法
Feb 01 PHP
lnmp安装多版本PHP共存的方法详解
Aug 02 #PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 #PHP
PHP实现数组根据某个单元字段排序操作示例
Aug 01 #PHP
PHP实现的分解质因数操作示例
Aug 01 #PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 #PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 #PHP
PHP实现随机数字、字母的验证码功能
Aug 01 #PHP
You might like
php数据库连接
2006/10/09 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
关于Js中new操作符的作用详解
2021/02/21 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
python实现udp数据报传输的方法
2014/09/26 Python
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
餐饮管理自我介绍信
2014/01/15 职场文书
项目考察欢迎辞
2014/01/17 职场文书
机关出纳岗位职责
2014/04/03 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
导师工作推荐信
2015/03/27 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
2015年初三班主任工作总结
2015/05/21 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
施工安全责任协议书
2016/03/23 职场文书
python基础详解之if循环语句
2021/04/24 Python
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android