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 相关文章推荐
AJAX for PHP简单表数据查询实例
Jan 02 PHP
PHP扩展编写点滴 技巧收集
Mar 09 PHP
简单PHP上传图片、删除图片实现代码
May 12 PHP
CURL的学习和应用(附多线程实现)
Jun 03 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
php导出excel格式数据问题
Mar 11 PHP
codeigniter显示所有脚本执行时间的方法
Mar 21 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
May 20 PHP
PHP中Array相关函数简介
Jul 03 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 09 PHP
PHP合并数组的2种方法小结
Nov 24 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中提问频率最高的11个面试题和答案
2014/09/02 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
jquery获取radio值实例
2014/10/16 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
如何运行带参数的python脚本
2019/11/15 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
python getopt模块使用实例解析
2019/12/18 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
java字符串格式化输出实例讲解
2021/01/06 Python
美国女孩服装购物网站:Justice
2017/03/04 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
实习评语
2013/12/16 职场文书
幼儿教育感言
2014/02/05 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
事业单位考核材料
2014/05/21 职场文书
优秀毕业生求职信
2014/06/05 职场文书
重阳节标语大全
2014/10/07 职场文书
家电创业计划书
2019/08/05 职场文书