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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
通过ODBC连接的SQL SERVER实例
Oct 09 PHP
用PHP生成html分页列表的代码
Mar 18 PHP
input file获得文件根目录简单实现
Apr 26 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
php中的常用魔术方法总结
Aug 02 PHP
PHP stream_context_create()函数的使用示例
May 12 PHP
PHP文件操作方法汇总
Jul 01 PHP
基于PHP后台的Android新闻浏览客户端
May 23 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
laravel 实现登陆后返回登陆前的页面方法
Oct 03 PHP
Laravel基础_关于view共享数据的示例讲解
Oct 14 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
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
javascript Window及document对象详细整理
2011/01/12 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
Python3爬楼梯算法示例
2019/03/04 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
Python如何执行系统命令
2020/09/23 Python
利用指针变量实现队列的入队操作
2012/04/07 面试题
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
公务员政审材料
2014/12/23 职场文书
西湖英语导游词
2015/02/06 职场文书
复活读书笔记
2015/06/29 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
创业计划书之面包店
2019/09/17 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript