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中通过ADODB库实现调用Access数据库之修正版本
Dec 31 PHP
PHP中文汉字验证码
Apr 08 PHP
php5新改动之短标记启用方法
Sep 11 PHP
php 安全过滤函数代码
May 07 PHP
php smarty 二级分类代码和模版循环例子
Jun 16 PHP
第4章 数据处理-php数组的处理-郑阿奇
Jul 04 PHP
PHP连接sql server 2005环境配置及问题解决
Aug 08 PHP
thinkphp模板赋值与替换实例简述
Nov 24 PHP
PHP异常处理Exception类
Dec 11 PHP
总结PHP中DateTime的常用方法
Aug 11 PHP
Zend Framework基于Command命令行建立ZF项目的方法
Feb 18 PHP
PHP 记录访客的浏览信息方法
Jan 29 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
PHP7 windows支持
2021/03/09 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
python的命名规则知识点总结
2019/10/04 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
《临死前的严监生》教学反思
2014/02/13 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
任命书怎么写
2015/03/02 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js
修改并编译golang源码的操作步骤
2021/07/25 Golang
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL