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中冒号、endif、endwhile、endfor使用介绍
Apr 28 PHP
使用PHP 5.0创建图形的巧妙方法
Oct 12 PHP
PHP 读取Postgresql中的数组
Apr 14 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
Thinkphp单字母函数使用指南
May 08 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
PHP实现微信小程序人脸识别刷脸登录功能
May 24 PHP
PHP实现普通hash分布式算法简单示例
Aug 06 PHP
laravel中的一些简单实用功能
Nov 03 PHP
PHP正则判断一个变量是否为正整数的方法
Feb 27 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
Apr 15 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 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程序之die调试法 快速解决错误
2009/09/17 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
一个简单的js动画效果代码
2010/07/20 Javascript
屏蔽IE弹出&quot;您查看的网页正在试图关闭窗口,是否关闭此窗口&quot;的方法
2013/12/31 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
Python转码问题的解决方法
2008/10/07 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
python实现类之间的方法互相调用
2018/04/29 Python
python如何读取bin文件并下发串口
2019/07/05 Python
python 将Excel转Word的示例
2021/03/02 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
Bjorn Borg官方网上商店:国际运动时尚品牌
2016/08/27 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
工程管理英文求职信
2014/03/18 职场文书
安全演讲稿大全
2014/05/09 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
2014年仓库工作总结
2014/11/20 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
800字作文之大雪
2019/12/04 职场文书
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers