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 相关文章推荐
PHP开发负载均衡指南
Jul 17 PHP
深入apache配置文件httpd.conf的部分参数说明
Jun 28 PHP
phpQuery占用内存过多的处理方法
Nov 13 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
PHP程序员的技术成长规划
Mar 25 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
PHP目录操作实例总结
Sep 27 PHP
thinkPHP多语言切换设置方法详解
Nov 11 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 PHP
php写入文件不覆盖的实例讲解
Sep 17 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 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
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
用Python中的字典来处理索引统计的方法
2015/05/05 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
django模板结构优化的方法
2019/02/28 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
Python如何使用正则表达式爬取京东商品信息
2020/06/01 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
幼儿园中班区域活动总结
2014/07/09 职场文书
学校实习推荐信
2015/03/27 职场文书
党内外群众意见范文
2015/06/02 职场文书