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+MySQL的聊天室设计
Oct 09 PHP
PHP 常见郁闷问题答解
Nov 25 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
Feb 01 PHP
使用PHP函数scandir排除特定目录
Jun 12 PHP
symfony表单与页面实现技巧
Jan 26 PHP
PHP获取当前日期和时间及格式化方法参数
May 11 PHP
腾讯CMEM的PHP扩展编译安装方法
Sep 25 PHP
Yii2中多表关联查询hasOne hasMany的方法
Feb 15 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
php微信公众号开发之欢迎老朋友
Oct 20 PHP
Laravel中9个不经常用的小技巧汇总
Apr 16 PHP
tp5.1框架数据库子查询操作实例分析
May 26 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分页类代码
2013/04/02 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
Python中的Classes和Metaclasses详解
2015/04/02 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
python下载的库包存放路径
2020/07/27 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
医院总经理职责
2013/12/26 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
质检员岗位职责
2015/02/03 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
Vue.Draggable实现交换位置
2022/04/07 Vue.js
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技