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 高手之路(一)
Oct 09 PHP
smarty实例教程
Nov 19 PHP
php读取30天之内的根据算法排序的代码
Apr 06 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
php获取一个变量的名字的方法
Sep 05 PHP
php设置静态内容缓存时间的方法
Dec 01 PHP
ucenter通信原理分析
Jan 09 PHP
php生成图片缩略图的方法
Apr 07 PHP
php实现图片上传、剪切功能
May 07 PHP
详解PHP编码转换函数应用技巧
Oct 22 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
PHP长连接实现与使用方法详解
Feb 11 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二维数组排序的函数分享
2014/01/17 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
把textarea中字符串里含有的回车换行替换成&amp;lt;br&amp;gt;的javascript代码
2007/04/20 Javascript
JavaScript 全角转半角部分
2009/10/28 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
jQuery中的for循环var与let的区别
2018/04/21 jQuery
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
Python备份Mysql脚本
2008/08/11 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
Python自省及反射原理实例详解
2020/07/06 Python
详解python中的闭包
2020/09/07 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
证券期货行业个人的自我评价
2013/12/26 职场文书
知名企业招聘广告词大全
2014/03/18 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
班主任高考寄语
2015/02/26 职场文书
Python自动化测试PO模型封装过程详解
2021/06/22 Python
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫