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连接Oracle数据库
Oct 09 PHP
小偷PHP+Html+缓存
Dec 20 PHP
php中用date函数获取当前时间有误的解决办法
Aug 02 PHP
PHP开发框架kohana中处理ajax请求的例子
Jul 14 PHP
Yii分页用法实例详解
Dec 04 PHP
Symfony数据校验方法实例分析
Jan 26 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
May 11 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
php判断电子邮件是否正确方法
Dec 04 PHP
详解使用php-cs-fixer格式化代码
Sep 16 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
5.PHP的其他功能
2006/10/09 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
jQuery实现跨域
2015/02/03 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
python实现超简单端口转发的方法
2015/03/13 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
Python实现网站表单提交和模板
2019/01/15 Python
PyQt实现计数器的方法示例
2021/01/18 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
大学毕业生自我鉴定
2013/11/05 职场文书
给排水工程师岗位职责
2013/11/21 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
出国导师推荐信
2015/03/25 职场文书
经费申请报告
2015/05/15 职场文书
三八妇女节新闻稿
2015/07/17 职场文书
mysql脏页是什么
2021/07/26 MySQL
MySQL Server 层四个日志
2022/03/31 MySQL