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 相关文章推荐
Apache2 httpd.conf 中文版
Nov 17 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
phpStudy访问速度慢和启动失败的解决办法
Nov 19 PHP
PHP抓取及分析网页的方法详解
Apr 26 PHP
YII框架中搜索分页jQuery写法详解
Dec 19 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 PHP
PHP 文件上传限制问题
Sep 01 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 中的类
2006/10/09 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
PHP比你想象的好得多
2014/11/27 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
深入浅析python的第三方库pandas
2020/02/13 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
实习自我鉴定范文
2013/10/30 职场文书
木工主管岗位职责
2013/12/08 职场文书
乡镇党建工作汇报材料
2014/10/27 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
开学第一天的感想
2015/08/10 职场文书
2016新年问候语大全
2015/11/11 职场文书
Python基础详解之邮件处理
2021/04/28 Python
java开发双人五子棋游戏
2022/05/06 Java/Android