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 自定义错误处理函数trigger_error()
Mar 26 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
通过dbi使用perl连接mysql数据库的方法
Apr 16 PHP
destoon设置自定义搜索的方法
Jun 21 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
php异常处理方法实例汇总
Jun 24 PHP
php中mkdir()函数的权限问题分析
Sep 24 PHP
PHP中的函数声明与使用详解
May 27 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 PHP
PHP使用ActiveMQ实例
Feb 05 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
Mar 04 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
自定义PHP分页函数
2006/10/09 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
微信小程序 地图(map)实例详解
2016/11/16 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
小程序云开发实战小结
2018/10/25 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
python 算法 排序实现快速排序
2012/06/05 Python
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
Python中文件操作简明介绍
2015/04/13 Python
python xml解析实例详解
2016/11/14 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
flask中的wtforms使用方法
2018/07/21 Python
python3 拼接字符串的7种方法
2018/09/12 Python
利用python修改json文件的value方法
2018/12/31 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
金属材料工程个人求职的自我评价
2013/12/04 职场文书
平面设计岗位职责
2013/12/14 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
小学生安全教育心得体会
2016/01/15 职场文书