php中AES加密解密的例子小结


Posted in PHP onFebruary 18, 2014

aesDemo.php:

例子,

<?php
require_once('./AES.php');
//$aes = new AES();
$aes = new AES(true);// 把加密后的字符串按十六进制进行存储
//$aes = new AES(true,true);// 带有调试信息且加密字符串按十六进制存储
$key = "this is a 32 byte key";// 密钥
$keys = $aes->makeKey($key);
$encode = "123456";// 被加密的字符串
$ct = $aes->encryptString($encode, $keys);
echo "encode = ".$ct."<br>";
$cpt = $aes->decryptString($ct, $keys);
echo "decode = ".$cpt;
?>

例子、AES加密类

<?php
//php aes加密类
class AESMcrypt {
public $iv = null;
public $key = null;
public $bit = 128;
private $cipher;
public function __construct($bit, $key, $iv, $mode) {
if(empty($bit) || empty($key) || empty($iv) || empty($mode))
return NULL;
$this->bit = $bit;
$this->key = $key;
$this->iv = $iv;
$this->mode = $mode;
switch($this->bit) {
case 192:$this->cipher = MCRYPT_RIJNDAEL_192; break;
case 256:$this->cipher = MCRYPT_RIJNDAEL_256; break;
default: $this->cipher = MCRYPT_RIJNDAEL_128;
} 
switch($this->mode) {
case 'ecb':$this->mode = MCRYPT_MODE_ECB; break;
case 'cfb':$this->mode = MCRYPT_MODE_CFB; break;
case 'ofb':$this->mode = MCRYPT_MODE_OFB; break;
case 'nofb':$this->mode = MCRYPT_MODE_NOFB; break;
default: $this->mode = MCRYPT_MODE_CBC;
}
}
public function encrypt($data) {
$data = base64_encode(mcrypt_encrypt( $this->cipher, $this->key, $data, $this->mode, $this->iv));
return $data;
}
public function decrypt($data) {
$data = mcrypt_decrypt( $this->cipher, $this->key, base64_decode($data), $this->mode, $this->iv);
$data = rtrim(rtrim($data), "..");
return $data;
}
}
//使用方法
$aes = new AESMcrypt($bit = 128, $key = 'abcdef1234567890', $iv = '0987654321fedcba', $mode = 'cbc');
$c = $aes->encrypt('haowei.me');
var_dump($aes->decrypt($c));

例子、附一个可加密可解密类

<?PHP
/**
 * AES加密、解密类
 * @author hushangming
 * 
 * 用法:
 * <pre>
 * // 实例化类
 * // 参数$_bit:格式,支持256、192、128,默认为128字节的
 * // 参数$_type:加密/解密方式,支持cfb、cbc、nofb、ofb、stream、ecb,默认为ecb
 * // 参数$_key:密钥,默认为abcdefghijuklmno
 * $tcaes = new TCAES(); 
 * $string = 'laohu';
 * // 加密
 * $encodeString = $tcaes->encode($string);
 * // 解密
 * $decodeString = $tcaes->decode($encodeString);
 * </pre>
 */
class TCAES{
 private $_bit = MCRYPT_RIJNDAEL_256;
 private $_type = MCRYPT_MODE_CBC;
 //private $_key = 'abcdefghijuklmno0123456789012345';
 private $_key = 'abcdefghijuklmno'; // 密钥
 private $_use_base64 = true;
 private $_iv_size = null;
 private $_iv = null; /**
  * @param string $_key 密钥
  * @param int $_bit 默认使用128字节
  * @param string $_type 加密解密方式
  * @param boolean $_use_base64 默认使用base64二次加密
  */
 public function __construct($_key = '', $_bit = 128, $_type = 'ecb', $_use_base64 = true){
  // 加密字节
  if(192 === $_bit){
   $this->_bit = MCRYPT_RIJNDAEL_192;
  }elseif(128 === $_bit){
   $this->_bit = MCRYPT_RIJNDAEL_128;
  }else{
   $this->_bit = MCRYPT_RIJNDAEL_256;
  }
  // 加密方法
  if('cfb' === $_type){
   $this->_type = MCRYPT_MODE_CFB;
  }elseif('cbc' === $_type){
   $this->_type = MCRYPT_MODE_CBC;
  }elseif('nofb' === $_type){
   $this->_type = MCRYPT_MODE_NOFB;
  }elseif('ofb' === $_type){
   $this->_type = MCRYPT_MODE_OFB;
  }elseif('stream' === $_type){
   $this->_type = MCRYPT_MODE_STREAM;
  }else{
   $this->_type = MCRYPT_MODE_ECB;
  }
  // 密钥
  if(!empty($_key)){
   $this->_key = $_key;
  }
  // 是否使用base64
  $this->_use_base64 = $_use_base64;
  $this->_iv_size = mcrypt_get_iv_size($this->_bit, $this->_type);
  $this->_iv = mcrypt_create_iv($this->_iv_size, MCRYPT_RAND);
 }
 /**
  * 加密
  * @param string $string 待加密字符串
  * @return string
  */
 public function encode($string){
  if(MCRYPT_MODE_ECB === $this->_type){
   $encodeString = mcrypt_encrypt($this->_bit, $this->_key, $string, $this->_type); 
  }else{
   $encodeString = mcrypt_encrypt($this->_bit, $this->_key, $string, $this->_type, $this->_iv);
  }
  if($this->_use_base64)
   $encodeString = base64_encode($encodeString);
  return $encodeString;
 }
 /**
  * 解密
  * @param string $string 待解密字符串
  * @return string
  */
 public function decode($string){
  if($this->_use_base64)
   $string = base64_decode($string);
  $string = $this->toHexString($string);
  if(MCRYPT_MODE_ECB === $this->_type){
   $decodeString = mcrypt_decrypt($this->_bit, $this->_key, $string, $this->_type);
  }else{
   $decodeString = mcrypt_decrypt($this->_bit, $this->_key, $string, $this->_type, $this->_iv);
  }
  return $decodeString;
 }
 /**
  * 将$string转换成十六进制
  * @param string $string
  * @return stream
  */
 private function toHexString ($string){
  $buf = "";
  for ($i = 0; $i < strlen($string); $i++){
   $val = dechex(ord($string{$i}));
   if(strlen($val)< 2)
    $val = "0".$val;
   $buf .= $val;
  }
  return $buf;
 }
 /**
  * 将十六进制流$string转换成字符串
  * @param stream $string
  * @return string
  */
 private function fromHexString($string){
  $buf = "";
  for($i = 0; $i < strlen($string); $i += 2){
   $val = chr(hexdec(substr($string, $i, 2)));
   $buf .= $val;
  }
  return $buf;
 }
}
PHP 相关文章推荐
最令PHP初学者头痛的十四个问题
Jul 12 PHP
使用 php4 加速 web 传输
Oct 09 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
php实现三级级联下拉框
Apr 17 PHP
ThinkPHP中where()使用方法详解
Apr 19 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 PHP
php PDO属性设置与操作方法分析
Dec 27 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
Aug 12 PHP
php报错502badgateway解决方法
Oct 11 PHP
eval(cmd)与eval($cmd)的区别与联系
Jul 07 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
Feb 18 #PHP
PHP中ini_set和ini_get函数的用法小结
Feb 18 #PHP
php获取参数的几种方法总结
Feb 18 #PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 #PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
Feb 18 #PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
Feb 18 #PHP
php阻止页面后退的方法分享
Feb 17 #PHP
You might like
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php读取文件内容的几种方法详解
2013/06/26 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
JavaScript DOM 添加事件
2009/02/14 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
浅析vue深复制
2018/01/29 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Python 类的继承实例详解
2017/03/25 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
python 杀死自身进程的实现方法
2019/07/01 Python
python实现人脸签到系统
2020/04/13 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
python xlsxwriter模块的使用
2020/12/24 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
介绍下Lucene建立索引的过程
2016/03/02 面试题
网络工程专业毕业生推荐信
2013/10/28 职场文书
销售总监岗位职责
2014/01/04 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
推广活动策划方案
2014/08/23 职场文书
社区干部培训心得体会
2016/01/06 职场文书
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang