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 iconv 函数转gb2312的bug解决方法
Oct 11 PHP
PHP中英混合字符串截取函数代码
Jul 17 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
Jun 10 PHP
php与flash as3 socket通信传送文件实现代码
Aug 16 PHP
php实现utf-8转unicode函数分享
Jan 06 PHP
php实现字符串首字母转换成大写的方法
Mar 17 PHP
PHP 常用的header头部定义汇总
Jun 19 PHP
ThinkPHP控制器详解
Jul 27 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
Mar 11 PHP
phpstorm 配置xdebug的示例代码
Mar 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
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
php文件上传的简单实例
2013/10/19 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
js loading加载效果实现代码
2009/11/24 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
python 中random模块的常用方法总结
2017/07/08 Python
Python之pymysql的使用小结
2019/07/01 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
python scatter函数用法实例详解
2020/02/11 Python
python logging 日志的级别调整方式
2020/02/21 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
C语言笔试集
2012/07/24 面试题
大学学年自我鉴定
2013/10/28 职场文书
专升本个人自我评价
2013/12/22 职场文书
《小小雨点》教学反思
2014/02/18 职场文书
工程质量承诺书
2014/03/27 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
大连导游词
2015/02/12 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS