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 遍历XP文件夹下所有文件
Nov 27 PHP
解析php框架codeigniter中如何使用框架的session
Jun 24 PHP
调整PHP的性能
Oct 30 PHP
6种php上传图片重命名的方法实例
Nov 04 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
PHP利用Socket获取网站的SSL证书与公钥
Jun 18 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
Aug 03 PHP
PHP实现获取文件mime类型多种方法解析
May 28 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
一个显示天气预报的程序
2006/10/09 PHP
建立文件交换功能的脚本(二)
2006/10/09 PHP
php中文本操作的类
2007/03/17 PHP
封装一个PDO数据库操作类代码
2009/09/09 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
jquery 将disabled的元素置为enabled的三种方法
2009/07/25 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
jQuery设置和获取HTML、文本和值示例
2014/07/08 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
js密码强度校验
2015/11/10 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Python爬虫文件下载图文教程
2018/12/23 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
给校长的建议书300字
2014/05/16 职场文书
邀请函格式范文
2015/02/02 职场文书
2015年教务工作总结
2015/05/23 职场文书
如何使用pdb进行Python调试
2021/06/30 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python