PHP扩展mcrypt实现的AES加密功能示例


Posted in PHP onJanuary 29, 2019

本文实例讲述了PHP扩展mcrypt实现的AES加密功能。分享给大家供大家参考,具体如下:

AES(Advanced Encryption Standard,高级加密标准)是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。Rijndael是在AES中使用的基本密码算法。

对于此算法网上流传有很多php代码实现的版本,其实php的扩展mcrypt完全支持此加密算法,不必要自己去写代码实现。先不说自己写费时费力(当然你若是想研究此加密算法,那另说),使用php代码实现的算法效率也不会太高。

mcrypt扩展在php中默认是没有的,需要自己安装配置,其方法可以在网上搜索,这里不在详述。你可以使用以下代码检查你的php环境是否支持mcrypt

$cipher_list = mcrypt_list_algorithms();//mcrypt支持的加密算法列表
$mode_list = mcrypt_list_modes(); //mcrypt支持的加密模式列表
echo '<xmp>';
print_r($cipher_list);
print_r($mode_list);

若你的环境支持mcrypt,输出结果应该如下:

Array
(
    [0] => cast-128
    [1] => gost
    [2] => rijndael-128
    [3] => twofish
    [4] => arcfour
    [5] => cast-256
    [6] => loki97
    [7] => rijndael-192
    [8] => saferplus
    [9] => wake
    [10] => blowfish-compat
    [11] => des
    [12] => rijndael-256
    [13] => serpent
    [14] => xtea
    [15] => blowfish
    [16] => enigma
    [17] => rc2
    [18] => tripledes
)
Array
(
    [0] => cbc
    [1] => cfb
    [2] => ctr
    [3] => ecb
    [4] => ncfb
    [5] => nofb
    [6] => ofb
    [7] => stream
)

例如本机采用wampserver环境,直接开启了mcrypt扩展:

PHP扩展mcrypt实现的AES加密功能示例

其中rijndael-128,rijndael-192,rijndael-256就是AES加密,3种分别是使用不同的数据块和密钥长度进行加密。

以下是使用扩展mcrypt实现AES加密的简单示例

/**
 * 利用mcrypt做AES加密解密
 * @author ts24<tsxw24@gmail.com>
 */
abstract class AES{
 /**
 * 算法,另外还有192和256两种长度
 */
 const CIPHER = MCRYPT_RIJNDAEL_128;
 /**
 * 模式
 */
 const MODE = MCRYPT_MODE_ECB;
 /**
 * 加密
 * @param string $key 密钥
 * @param string $str 需加密的字符串
 * @return type
 */
 static public function encode( $key, $str ){
 $iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
 return mcrypt_encrypt(self::CIPHER, $key, $str, self::MODE, $iv);
 }
 /**
 * 解密
 * @param type $key
 * @param type $str
 * @return type
 */
 static public function decode( $key, $str ){
 $iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
 return mcrypt_decrypt(self::CIPHER, $key, $str, self::MODE, $iv);
 }
}

使用示例:

$str = '我是明文我是明文我是明文我是明文我是明文dsfdghgasdfasdddddddd';
$key = 'aSGJLGYEWERWRREW4567i8o';
$str1=AES::encode($key, $str);
$str2=AES::decode($key, $str1);
echo '<xmp>';
var_dump($str);
var_dump($str1);
var_dump($str2);
var_dump(rtrim($str2));

输出结果

PHP扩展mcrypt实现的AES加密功能示例

问题,不知道是什么原因,解密后的字符串(见上图),末尾还留下有不可见的填充字符,当明文刚好可以分组时则没有。

PHP 相关文章推荐
php知道与问问的采集插件代码
Oct 12 PHP
php递归方法实现无限分类实例代码
Feb 28 PHP
PHP中copy on write写时复制机制介绍
May 13 PHP
php+mysqli使用面向对象方式更新数据库实例
Jan 29 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
PHP最常用的正则表达式
Feb 13 PHP
php生成图片缩略图功能示例
Feb 22 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
Yii2结合Workerman的websocket示例详解
Sep 10 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
Nov 13 PHP
Yii2.0建立公共方法简单示例
Jan 29 #PHP
使用vs code编辑调试php配置的方法
Jan 29 #PHP
Yii2.0实现的批量更新及批量插入功能示例
Jan 29 #PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 #PHP
PDO::inTransaction讲解
Jan 28 #PHP
PDO::getAvailableDrivers讲解
Jan 28 #PHP
PDO::getAttribute讲解
Jan 28 #PHP
You might like
php 执行系统命令的方法
2009/07/07 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
Python基于twisted实现简单的web服务器
2014/09/29 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
职工小家建设活动方案
2014/08/25 职场文书
走群众路线剖析材料
2014/10/09 职场文书
应急管理工作总结2015
2015/05/04 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
毕业实习感受与体会
2015/05/26 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android