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 相关文章推荐
快速开发一个PHP扩展图文教程
Dec 12 PHP
phpMyAdmin 安装及问题总结
May 28 PHP
php多文件上传实现代码
Feb 20 PHP
php自定义apk安装包实例
Oct 20 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
PHP使用递归生成文章树
Apr 21 PHP
ThinkPHP文件缓存类代码分享
Apr 22 PHP
php根据日期显示所在星座的方法
Jul 13 PHP
微信支付开发交易通知实例
Jul 12 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
May 30 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
实例讲解php实现多线程
Jan 27 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
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
php网站判断用户是否是手机访问的方法
2013/11/01 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
Javascript Math对象
2009/08/13 Javascript
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
2010/09/12 Javascript
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
详解使用vue实现tab 切换操作
2017/07/03 Javascript
vue中如何使用ztree
2018/02/06 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
Python在线运行代码助手
2016/07/15 Python
从0开始的Python学习016异常
2019/04/08 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
python3调用windows dos命令的例子
2019/08/14 Python
基于python 取余问题(%)详解
2020/06/03 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
weblogic面试题
2016/03/07 面试题
生物制药专业自我鉴定
2014/02/19 职场文书
土地转让协议书
2014/09/27 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
毕业生见习报告总结
2014/11/08 职场文书
优秀团员自我评价
2015/03/10 职场文书
四十年同学聚会致辞
2015/07/28 职场文书