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调用三种数据库的方法(3)
Oct 09 PHP
Access数据库导入Mysql的方法之一
Oct 09 PHP
PHP session有效期问题
Apr 26 PHP
网站用php实现paypal整合方法
Nov 28 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
php中ob函数缓冲机制深入理解
Aug 03 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
php面向对象程序设计入门教程
Jun 22 PHP
laravel框架与其他框架的详细对比
Oct 23 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 PHP
PHP生成图表pChart的示例解析
Jul 31 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
在Windows中安装Apache2和PHP4的权威指南
2006/10/09 PHP
第五章 php数组操作
2011/12/30 PHP
PHP编程入门的基本语法知识点总结
2016/01/26 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
Python同步遍历多个列表的示例
2019/02/19 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
英智兴达软件测试笔试题
2016/10/12 面试题
茶叶店创业计划书范文
2014/01/19 职场文书
英文商务邀请信
2014/01/22 职场文书
请假条格式范文
2014/04/10 职场文书
篮球比赛策划方案
2014/06/05 职场文书
比赛口号大全
2014/06/10 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
医院见习总结
2015/06/24 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
Java后台生成图片的完整步骤
2021/08/04 Java/Android