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连接mysql数据库代码
Mar 10 PHP
PHP 程序员应该使用的10个组件
Oct 31 PHP
php中\r \r\n \t的区别示例介绍
Feb 08 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 PHP
PHP开发框架kohana中处理ajax请求的例子
Jul 14 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
Jan 09 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 PHP
PHP基于单例模式编写PDO类的方法
Sep 13 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
php关联数组与索引数组及其显示方法
Mar 12 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 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面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
Javascript的this用法
2017/01/16 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
求职信内容考虑哪几点
2013/10/05 职场文书
机电专业毕业生求职信
2013/10/27 职场文书
应用艺术专业个人的自我评价
2014/01/03 职场文书
丑小鸭教学反思
2014/02/03 职场文书
《自然之道》教学反思
2014/02/11 职场文书
2014年小班元旦活动方案
2014/02/16 职场文书
总经理任命书范本
2014/06/05 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
外出考察学习心得体会
2016/01/18 职场文书