php写的AES加密解密类分享


Posted in PHP onJune 20, 2014

今天写了一个php的AES加密类。适用于Yii的扩展。
如果不用在Yii框架中,把代码中Yii::app()->params['encryptKey'] 换成你对应的默认key就可以了。
类代码:

<?php
/**
 * php AES加解密类
 * 如果要与java共用,则密钥长度应该为16位长度
 * 因为java只支持128位加密,所以php也用128位加密,可以与java互转。
 * 同时AES的标准也是128位。只是RIJNDAEL算法可以支持128,192和256位加密。
 * java 要使用AES/CBC/NoPadding标准来加解密
 * 
 * @author Terry
 *
 */
class PhpAes
{
	/**
	 * This was AES-128 / CBC / NoPadding encrypted.
	 * return base64_encode string
	 * @author Terry
	 * @param string $plaintext
	 * @param string $key
	 */
	public static function AesEncrypt($plaintext,$key = null)
	{
		$plaintext = trim($plaintext);
		if ($plaintext == '') return '';
		if(!extension_loaded('mcrypt'))
			throw new CException(Yii::t('yii','AesEncrypt requires PHP mcrypt extension to be loaded in order to use data encryption feature.'));
		$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
		$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
		$key=self::substr($key===null ? Yii::app()->params['encryptKey'] : $key, 0, mcrypt_enc_get_key_size($module));
		/* Create the IV and determine the keysize length, use MCRYPT_RAND
		 * on Windows instead */
		$iv = substr(md5($key),0,mcrypt_enc_get_iv_size($module));
		/* Intialize encryption */
		mcrypt_generic_init($module, $key, $iv);

		/* Encrypt data */
		$encrypted = mcrypt_generic($module, $plaintext);

		/* Terminate encryption handler */
		mcrypt_generic_deinit($module);
		mcrypt_module_close($module);
		return base64_encode($encrypted);
	}

	/**
	 * This was AES-128 / CBC / NoPadding decrypted.
	 * @author Terry
	 * @param string $encrypted		base64_encode encrypted string
	 * @param string $key
	 * @throws CException
	 * @return string
	 */
	public static function AesDecrypt($encrypted, $key = null)
	{
		if ($encrypted == '') return '';
		if(!extension_loaded('mcrypt'))
			throw new CException(Yii::t('yii','AesDecrypt requires PHP mcrypt extension to be loaded in order to use data encryption feature.'));

		$ciphertext_dec = base64_decode($encrypted);
		$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
		$key=self::substr($key===null ? Yii::app()->params['encryptKey'] : $key, 0, mcrypt_enc_get_key_size($module));

		$iv = substr(md5($key),0,mcrypt_enc_get_iv_size($module));

		/* Initialize encryption module for decryption */
		mcrypt_generic_init($module, $key, $iv);

		/* Decrypt encrypted string */
		$decrypted = mdecrypt_generic($module, $ciphertext_dec);

		/* Terminate decryption handle and close module */
		mcrypt_generic_deinit($module);
		mcrypt_module_close($module);
		return rtrim($decrypted,"\0");
	}

	/**
	 * Returns the length of the given string.
	 * If available uses the multibyte string function mb_strlen.
	 * @param string $string the string being measured for length
	 * @return integer the length of the string
	 */
	private static function strlen($string)
	{
		return extension_loaded('mbstring') ? mb_strlen($string,'8bit') : strlen($string);
	}

	/**
	 * Returns the portion of string specified by the start and length parameters.
	 * If available uses the multibyte string function mb_substr
	 * @param string $string the input string. Must be one character or longer.
	 * @param integer $start the starting position
	 * @param integer $length the desired portion length
	 * @return string the extracted part of string, or FALSE on failure or an empty string.
	 */
	private static function substr($string,$start,$length)
	{
		return extension_loaded('mbstring') ? mb_substr($string,$start,$length,'8bit') : substr($string,$start,$length);
	}
}
PHP 相关文章推荐
PHP简单系统查询模块代码打包下载
Jun 07 PHP
PHP OPCode缓存 APC详细介绍
Oct 12 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
PHP测试程序运行时间的类
Feb 05 PHP
php中stream(流)的用法
Mar 25 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
PHP防盗链的基本思想 防盗链的设置方法
Sep 25 PHP
Laravel中注册Facades的步骤详解
Mar 16 PHP
magento后台无法登录解决办法的两种方法
Dec 09 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
PHP区块查询实现方法分析
May 12 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 #PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 #PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 #PHP
windows下配置apache+php+mysql时出现问题的处理方法
Jun 20 #PHP
PHP扩展CURL的用法详解
Jun 20 #PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 #PHP
ThinkPHP3.1查询语言详解
Jun 19 #PHP
You might like
PHP通用检测函数集合
2011/02/08 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
WEB前端设计师常用工具集锦
2014/12/09 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
arcgis for js 修改infowindow样式的方法
2016/11/02 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
解决vue项目获取dom元素宽高总是不准确问题
2020/07/29 Javascript
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
python复制文件到指定目录的实例
2018/04/27 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
2020/03/27 Python
在keras中实现查看其训练loss值
2020/06/16 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
PHP面试题集
2016/12/18 面试题
应届大学生自荐信格式
2013/09/21 职场文书
科研课题实施方案
2014/03/18 职场文书
共产党员承诺书
2014/03/25 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python