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 相关文章推荐
dede全站URL静态化改造[070414更正]
Apr 17 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
Jun 20 PHP
解析linux下安装memcacheq(mcq)全过程笔记
Jun 27 PHP
PHP常用函数和常见疑难问题解答
Mar 05 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
Oct 26 PHP
PHP+MySQL实现模糊查询员工信息功能示例
Jun 01 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
Oct 14 PHP
在PHP中输出JS语句以及乱码问题的解决方案
Feb 13 PHP
PHP的new static和new self的区别与使用
Nov 27 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生成随机密码类分享
2014/06/25 PHP
php实现微信支付之退款功能
2018/05/30 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
2016/06/12 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
Python内置模块turtle绘图详解
2017/12/09 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
谈谈Python中的while循环语句
2019/03/10 Python
Django学习之文件上传与下载
2019/10/06 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
绩效管理实施方案
2014/03/19 职场文书
保密工作责任书
2014/04/16 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
小学教育见习报告
2014/10/31 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书