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采集相关教程之一 CURL函数库
Feb 15 PHP
php 在文件指定行插入数据的代码
May 08 PHP
PHP 强制下载文件代码
Oct 24 PHP
深入PHP FTP类的详解
Jun 13 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
php关键字仅替换一次的实现函数
Oct 29 PHP
Yii快速入门经典教程
Dec 28 PHP
php中实现字符串翻转的方法
Feb 22 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
Sep 05 PHP
解决PhpStorm64不能启动的问题
Jun 20 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 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 intval的测试代码发现问题
2008/07/27 PHP
php 文件上传类代码
2011/08/06 PHP
浅析php数据类型转换
2014/01/09 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
javascript中的new使用
2010/03/20 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
Python对列表排序的方法实例分析
2015/05/16 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
美国汽车交易网站:Edmunds
2016/08/17 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
枚举与#define宏的区别
2014/04/30 面试题
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
护士找工作求职信
2014/07/02 职场文书
Python图片验证码降噪和8邻域降噪
2021/08/30 Python
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL