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安装攻略:常见问题解答(三)
Oct 09 PHP
php 图片加水印与上传图片加水印php类
May 12 PHP
利用PHP实现短域名互转
Jul 05 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
PHP 二维数组根据某个字段排序的具体实现
Jun 03 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
smarty中post用法实例
Nov 28 PHP
PHP按指定键值对二维数组进行排序的方法
Dec 22 PHP
浅析Yii2 GridView实现下拉搜索教程
Apr 22 PHP
PHP多种序列化/反序列化的方法详解
Jun 23 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
Dec 11 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 socket(fsockopen)的应用实例分析
2013/06/02 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
PHP xpath()函数讲解
2019/02/11 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
Python实现的Excel文件读写类
2015/07/30 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
Django websocket原理及功能实现代码
2020/11/14 Python
秋季婚礼证婚词
2014/01/11 职场文书
自荐书4要点
2014/01/25 职场文书
合作意向书模板
2014/03/31 职场文书
合伙协议书范本
2014/04/21 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
2014年实习生工作总结
2014/11/27 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
新郎结婚感言
2015/07/31 职场文书
导游词之崇武古城
2019/10/07 职场文书
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL