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的ASP防火墙
Oct 09 PHP
PHP时间戳使用实例代码
Jun 07 PHP
PHP mkdir()定义和用法
Jan 14 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
Sep 30 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
php结合安卓客户端实现查询交互实例
May 05 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
CodeIgniter连贯操作的底层原理分析
May 17 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
Feb 15 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 include和require的区别深入解析
2013/06/17 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
2019/05/20 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
2020/03/18 PHP
TP3.2框架分页相关实现方法分析
2020/06/03 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
2018/08/08 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
python email smtplib模块发送邮件代码实例
2018/04/26 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
Python3.8中使用f-strings调试
2019/05/22 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Django后台admin的使用详解
2019/07/08 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
便利店投资创业计划书
2014/02/08 职场文书
安全生产责任书范本
2014/04/15 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
党员四风剖析材料
2014/08/27 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
Python字符串常规操作小结
2022/04/03 Python
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle