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 基本语法格式
Dec 15 PHP
php设计模式小结
Feb 15 PHP
深入php常用函数的使用汇总
Jun 08 PHP
理解PHP中的stdClass类
Apr 18 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
Linux下PHP安装mcrypt扩展模块笔记
Sep 10 PHP
Cygwin中安装PHP方法步骤
Jul 04 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
php实现按天数、星期、月份查询的搜索框
May 02 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 PHP
php实现推荐功能的简单实例
Sep 29 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
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
2007/01/09 Javascript
My Desktop :) 桌面式代码
2008/12/29 Javascript
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
WebPack基础知识详解
2017/01/16 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
vue模式history下在iis中配置流程
2019/04/17 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
node crawler如何添加promise支持
2020/02/01 Javascript
用Python抢过年的火车票附源码
2015/12/07 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
Django实现分页功能
2018/07/02 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
Python matplotlib可视化实例解析
2020/06/01 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
三星英国官网:Samsung英国
2018/09/25 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
文明礼仪事迹材料
2014/01/09 职场文书
表彰先进集体通报
2014/01/12 职场文书
幼儿教师研修感言
2014/02/12 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
小学社团活动总结
2014/06/27 职场文书
领导新年致辞2016
2015/07/29 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python