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下批量挂马和批量清马代码
Feb 27 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
PHP引用符&amp;的用法详细解析
Aug 22 PHP
php顺序查找和二分查找示例
Mar 27 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
php启用sphinx全文搜索的实现方法
Dec 24 PHP
简单理解PHP的面向对象编程方式
May 17 PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
浅析PHP7的多进程及实例源码
Apr 14 PHP
Yii框架连表查询操作示例
Sep 06 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
PHP制作图形验证码代码分享
2014/10/23 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
python实现远程控制电脑
2019/05/23 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
python with语句的原理与用法详解
2020/03/30 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
荷兰本土平价百货:HEMA
2017/10/23 全球购物
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
中专毕业生自我鉴定范文
2013/11/09 职场文书
会计专业毕业生自荐信范文
2013/12/20 职场文书
2014年转正工作总结
2014/11/08 职场文书
环卫工人慰问信
2015/02/15 职场文书
毕业生入职感言
2015/07/31 职场文书
初中运动会闭幕词范本3篇
2019/12/09 职场文书