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中用加号与用array_merge合并数组的区别深入分析
Jun 03 PHP
如何在php中正确的使用json
Aug 06 PHP
使用phpQuery采集网页的方法
Nov 13 PHP
PHP函数getenv简介和使用实例
May 12 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
PHP date函数常用时间处理方法
May 11 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
Jun 02 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
php操作mongodb封装类与用法实例
Sep 01 PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 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利用单例模式实现日志处理类库
2014/02/10 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
vue 地区选择器v-distpicker的常用功能
2019/07/23 Javascript
[36:16]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.19
2020/12/24 DOTA
python常见数制转换实例分析
2015/05/09 Python
python中requests小技巧
2017/05/10 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
意大利制造的西装、衬衫和针对男士量身定制的服装:Lanieri
2018/04/08 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
自我评价的范文
2014/02/02 职场文书
体育教师个人总结
2015/02/09 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js