php实现的AES加密类定义与用法示例


Posted in PHP onJanuary 29, 2018

本文实例讲述了php实现的AES加密类定义与用法。分享给大家供大家参考,具体如下:

CryptAES.class.php文件:

<?php
class CryptAES
{
 protected $cipher = MCRYPT_RIJNDAEL_128;
 protected $mode = MCRYPT_MODE_ECB;
 protected $pad_method = NULL;
 protected $secret_key = '';
 protected $iv = '';
 public function set_cipher($cipher)
 {
 $this->cipher = $cipher;
 }
 public function set_mode($mode)
 {
 $this->mode = $mode;
 }
 public function set_iv($iv)
 {
 $this->iv = $iv;
 }
 public function set_key($key)
 {
 $this->secret_key = $key;
 }
 public function require_pkcs5()
 {
 $this->pad_method = 'pkcs5';
 }
 protected function pad_or_unpad($str, $ext)
 {
 if ( is_null($this->pad_method) )
 {
  return $str;
 }
 else
 {
  $func_name = __CLASS__ . '::' . $this->pad_method . '_' . $ext . 'pad';
  if ( is_callable($func_name) )
  {
  $size = mcrypt_get_block_size($this->cipher, $this->mode);
  return call_user_func($func_name, $str, $size);
  }
 }
 return $str;
 }
 protected function pad($str)
 {
 return $this->pad_or_unpad($str, '');
 }
 protected function unpad($str)
 {
 return $this->pad_or_unpad($str, 'un');
 }
 public function encrypt($str)
 {
 $str = $this->pad($str);
 $td = mcrypt_module_open($this->cipher, '', $this->mode, '');
 if ( empty($this->iv) )
 {
  $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
 }
 else
 {
  $iv = $this->iv;
 }
 mcrypt_generic_init($td, $this->secret_key, $iv);
 $cyper_text = mcrypt_generic($td, $str);
 //$rt=base64_encode($cyper_text);
 $rt = bin2hex($cyper_text);
 mcrypt_generic_deinit($td);
 mcrypt_module_close($td);
 return $rt;
 }
 public function decrypt($str){
 $td = mcrypt_module_open($this->cipher, '', $this->mode, '');
 if ( empty($this->iv) )
 {
  $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
 }
 else
 {
  $iv = $this->iv;
 }
 mcrypt_generic_init($td, $this->secret_key, $iv);
 $decrypted_text = mdecrypt_generic($td, self::hex2bin($str));
 //$decrypted_text = mdecrypt_generic($td, base64_decode($str));
 $rt = $decrypted_text;
 mcrypt_generic_deinit($td);
 mcrypt_module_close($td);
 return $this->unpad($rt);
 }
 public static function hex2bin($hexdata) {
 $bindata = '';
 $length = strlen($hexdata);
 for ($i=0; $i < $length; $i += 2)
 {
  $bindata .= chr(hexdec(substr($hexdata, $i, 2)));
 }
 return $bindata;
 }
 public static function pkcs5_pad($text, $blocksize)
 {
 $pad = $blocksize - (strlen($text) % $blocksize);
 return $text . str_repeat(chr($pad), $pad);
 }
 public static function pkcs5_unpad($text)
 {
 $pad = ord($text{strlen($text) - 1});
 if ($pad > strlen($text)) return false;
 if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
 return substr($text, 0, -1 * $pad);
 }
}
?>

用法:

require_once("CryptAES.class.php");
$keyStr = 'ss4fs4skfhksk';
$aes = new CryptAES();
$keyStr = $aes->hex2bin($keyStr);
$aes->set_key($keyStr);
$aes->require_pkcs5();
$d = $aes->encrypt($data);

注:这里需要在php.ini中开启:extension=php_mcrypt.dll

PHP 相关文章推荐
使用zend studio for eclipse不能激活代码提示功能的解决办法
Oct 11 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
我的php学习笔记(毕业设计)
Feb 21 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
php实现无限级分类查询(递归、非递归)
Mar 10 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 PHP
详解php语言最牛掰的Laravel框架
Nov 20 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 PHP
php提取微信账单的有效信息
Oct 01 PHP
PHP中使用mpdf 导出PDF文件的实现方法
Oct 22 PHP
laravel 错误处理,接口错误返回json代码
Oct 25 PHP
php 判断IP为有效IP地址的方法
Jan 28 #PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 #PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
Jan 27 #PHP
PHP设计模式之注册树模式分析
Jan 26 #PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 #PHP
PHP CURL与java http使用方法详解
Jan 26 #PHP
php实现mysql连接池效果实现代码
Jan 25 #PHP
You might like
php ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
常用python爬虫库介绍与简要说明
2020/01/25 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
python numpy实现rolling滚动案例
2020/06/08 Python
Python字典dict常用方法函数实例
2020/11/09 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
C++:局部变量能否和全局变量重名
2014/03/03 面试题
介绍一下linux文件系统分配策略
2012/11/17 面试题
生产部厂长职位说明书
2014/03/03 职场文书
公司开业庆典主持词
2014/03/21 职场文书
2014个人年度工作总结
2014/12/15 职场文书
死亡诗社观后感
2015/06/05 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript