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中Session的概念
Oct 09 PHP
php+mysql事务rollback&amp;commit示例
Feb 08 PHP
php UBB 解析实现代码
Nov 27 PHP
奇怪的PHP引用效率问题分析
Mar 23 PHP
PHP If Else(elsefi) 语句
Apr 07 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
PHP中nowdoc和heredoc使用需要注意的一点
Mar 21 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
Dec 18 PHP
PHP实现的简单适配器模式示例
Jun 22 PHP
PHP使用Session实现上传进度功能详解
Aug 06 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
如何在PHP中生成随机数
Jun 04 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开发框架myqee新手快速入门教程
2014/07/14 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
GOJS+VUE实现流程图效果
2018/12/01 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
在layui.use 中自定义 function 的正确方法
2019/09/16 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
使用Python中的cookielib模拟登录网站
2015/04/09 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
医疗器械售后服务承诺书
2014/05/21 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS