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 相关文章推荐
第四节 构造函数和析构函数 [4]
Oct 09 PHP
如何在PHP中使用Oracle数据库(2)
Oct 09 PHP
php中目录,文件操作详谈
Mar 19 PHP
UCenter Home二次开发指南
May 28 PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
windows下开发并编译PHP扩展的方法
Mar 18 PHP
php cookies中删除的一般赋值方法
May 07 PHP
php curl模拟post提交数据示例
Dec 31 PHP
php判断数组中是否存在指定键(key)的方法
Mar 17 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
May 25 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 PHP
[原创]php实现子字符串位置相互对调互换的方法
Jun 02 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/06/10 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
PHP7新特性
2021/03/09 PHP
javascript中的new使用
2010/03/20 Javascript
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python实现从订阅源下载图片的方法
2015/03/11 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
工厂总经理岗位职责
2014/02/07 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
大班亲子运动会方案
2014/06/10 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
单位未婚证明范本
2014/11/25 职场文书
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
win10清理dns缓存
2022/04/19 数码科技
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL