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中使用Oracle数据库(3)
Oct 09 PHP
PHP 判断常量,变量和函数是否存在
Apr 26 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
json的键名为数字时的调用方式(示例代码)
Nov 15 PHP
PHP超全局数组(Superglobals)介绍
Jul 01 PHP
PHP实现linux命令tail -f
Feb 22 PHP
php while循环控制的简单实例
May 30 PHP
php基于闭包实现函数的自调用(递归)实例分析
Nov 11 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
php操作redis数据库常见方法实例总结
Feb 20 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
vue生命周期与钩子函数简单示例
2019/03/13 Javascript
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
Python判断某个用户对某个文件的权限
2016/10/13 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Python函数参数操作详解
2018/08/03 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
升职自荐书范文
2013/11/28 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
小学班主任事迹材料
2014/12/17 职场文书
街道社区活动报告
2015/02/05 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python