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 相关文章推荐
模拟OICQ的实现思路和核心程序(二)
Oct 09 PHP
?算你??的 PHP 程式大小
Dec 06 PHP
PHP使用数组实现队列
Feb 05 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
Jan 06 PHP
解析php php_openssl.dll的作用
Jul 01 PHP
php 获取SWF动画截图示例代码
Feb 10 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
简单谈谈PHP中strlen 函数
Feb 27 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
Aug 28 PHP
php使用正则表达式去掉html中的注释方法
Nov 03 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
Jan 04 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
提问的智慧(2)
2006/10/09 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
php链式操作的实现方式分析
2019/08/12 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
JavaScript对象属性检查、增加、删除、访问操作实例
2015/07/08 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
ajax的分页查询示例(不刷新页面)
2017/01/11 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
Python中的类学习笔记
2014/09/23 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
Python3中exp()函数用法分析
2019/02/19 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
Unix里面如何在后台运行程序
2016/10/14 面试题
中医药大学毕业生自荐信
2013/11/08 职场文书
根叔历年演讲稿
2014/05/20 职场文书
财务管理专业求职信
2014/06/11 职场文书
活动总结格式
2014/08/30 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
国防教育标语
2014/10/08 职场文书
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技