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 print EOF实现方法
May 21 PHP
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
php生成静态页面的简单示例
Apr 17 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
Nov 10 PHP
WordPress中调试缩略图的相关PHP函数使用解析
Jan 07 PHP
非常经典的PHP文件上传类分享
May 15 PHP
PHP实现数据分页显示的简单实例
May 26 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
Apr 18 PHP
PHP实现字符串大小写转函数的功能实例
Feb 06 PHP
PHP中$GLOBALS与global的区别详解
Mar 21 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 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实现TCP端口检测的方法
2015/04/01 PHP
PHP中使用curl入门教程
2015/07/02 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
jQuery对象[0]是什么含义?
2010/07/31 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
JavaScript必知必会(七)js对象继承
2016/06/08 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
Python自动重试HTTP连接装饰器
2015/04/28 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
python新手学习可变和不可变对象
2020/06/11 Python
Keras搭建自编码器操作
2020/07/03 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
电子信息毕业生自荐信
2013/11/16 职场文书
美术专业个人自我评价
2014/01/18 职场文书
文明家庭先进事迹材
2014/01/27 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
合作投资意向书
2014/04/01 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
离婚上诉状范文
2015/05/23 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
爱的教育读书笔记
2015/06/26 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书