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将整个网站生成HTML纯静态网页的方法总结
Feb 05 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
php cli模式学习(PHP命令行模式)
Jun 03 PHP
PHP实现读取一个1G的文件大小
Aug 24 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
php购物车实现方法
Jan 03 PHP
PHP动态规划解决0-1背包问题实例分析
Mar 23 PHP
Smarty使用自定义资源的方法
Aug 08 PHP
PHP中Http协议post请求参数
Nov 02 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 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
Session的工作方式
2006/10/09 PHP
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
浅析Python中的多进程与多线程的使用
2015/04/07 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
python右对齐的实例方法
2020/07/05 Python
Python3爬虫关于识别点触点选验证码的实例讲解
2020/07/30 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
学校七一活动方案
2014/01/19 职场文书
质量提升方案
2014/06/16 职场文书
地球一小时宣传标语
2014/06/24 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书