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网站备份程序代码分享
Jun 10 PHP
php array_map()数组函数使用说明
Jul 12 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
Nov 02 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
Nov 23 PHP
PHP容易忘记的知识点分享
Apr 30 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
Jun 19 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
php获取网页里所有图片并存入数组的方法
Apr 06 PHP
phpStudy访问速度慢和启动失败的解决办法
Nov 19 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 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
解析wamp5下虚拟机配置文档
2013/06/27 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
VBScript版代码高亮
2006/06/26 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
什么是DOM(Document Object Model)文档对象模型
2012/03/05 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
vue实现信息管理系统
2020/05/30 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
Python程序员开发中常犯的10个错误
2014/07/07 Python
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Python实现翻转数组功能示例
2018/01/12 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
python实现汽车管理系统
2018/11/30 Python
python爬取微信公众号文章的方法
2019/02/26 Python
python装饰器练习题及答案
2019/11/01 Python
python集合能干吗
2020/07/19 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
团员学习总结的自我评价范文
2013/10/14 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
财务担保书范文
2014/04/02 职场文书
煤矿安全承诺书
2014/05/22 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
中学语文教学反思
2016/02/16 职场文书