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脚本的10个技巧(8)
Oct 09 PHP
php表单转换textarea换行符的方法
Sep 10 PHP
php网上商城购物车设计代码分享
Feb 15 PHP
解析php函数method_exists()与is_callable()的区别
Jun 21 PHP
使用PHP编写的SVN类
Jul 18 PHP
PHP程序员基本要求和必备技能
May 09 PHP
Laravel 5 框架入门(四)完结篇
Apr 09 PHP
PHP检测数据类型的几种方法(总结)
Mar 04 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
thinkphp中U方法按路由规则生成url的方法
Mar 12 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
php面象对象数据库操作类实例
2014/12/02 PHP
php正则修正符用法实例详解
2016/12/29 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
JavaScript的类型简单说明
2010/09/03 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
关于js中的鼠标事件总结
2017/07/11 Javascript
浅谈node的事件机制
2017/10/09 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
Python reversed函数及使用方法解析
2020/03/17 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
python脚本定时发送邮件
2020/12/22 Python
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
超市开学活动方案
2014/03/01 职场文书
采购求职信
2014/03/17 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL