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
Oct 09 PHP
IStream与TStream之间的相互转换
Aug 01 PHP
php获取当前网址url并替换参数或网址的方法
Jun 06 PHP
解析PHP中一些可能会被忽略的问题
Jun 21 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
Apr 30 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
摘自织梦CMS的HTTP文件下载类
Aug 08 PHP
PHP加密解密实例分析
Dec 25 PHP
smarty高级特性之对象的使用方法
Dec 25 PHP
Smarty3配置及入门语法
Feb 22 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
Apr 15 PHP
php无限级评论嵌套实现代码
Apr 18 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面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
php jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
PHP源码之explode使用说明
2011/08/05 PHP
PHP中将网页导出为Word文档的代码
2012/05/25 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
微信小程序 冒泡事件原理解析
2019/09/27 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
python根据日期返回星期几的方法
2015/07/06 Python
python实现简单爬虫功能的示例
2016/10/24 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
Java程序员面试题
2016/09/27 面试题
优秀应届毕业生推荐信
2014/02/18 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
甜品店创业计划书
2014/08/14 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
学校党员干部承诺书
2015/05/04 职场文书
入党团支部推荐意见
2015/06/02 职场文书