mcrypt启用 加密以及解密过程详细解析


Posted in PHP onAugust 07, 2013

Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原。

1.PHP加密扩展库Mcrypt安装
在标准的PHP安装过程中并没有把Mrcypt安装上,但PHP的主目录下包含了libmcrypt.dll和libmhash.dll文件 (libmhash.dll是Mhash扩展库,这里可以一起装上)。首先,将这两个文件复制到系统目录windows\system32下,然后在 PHP.ini文件中按Ctrl+F快捷键跳出查找框,并找到;extension=php-mcrypt.dll和; extension=php_mhash.dll这两个语句,接着将前面的“;”去掉;最后,保存并重启Apache服务器即可生效。

2.PHP加密扩展库Mcrypt的算法和加密模式
Mcrypt库支持20多种加密算法和8种加密模式,具体可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示,结果如下:

Mcrypt支持的算法有:cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 tripledes

Mcrypt支持的加密模式有:cbc cfb ctr ecb ncfb nofb ofb stream

这些算法和模式在应用中要以常量来表示,写的时候加上前缀MCRYPT_和MCRYPT_来表示,如下面Mcrypt应用的例子:
DES算法表示为MCRYPT_DES;
ECB模式表示为MCRYPT_MODE_ECB;

3.PHP加密扩展库Mcrypt应用
先看一个例子,了解Mcrypt的工作流程,再来看看部分流程使用的函数:

    $str = "我是李云";
    $key = "123qwe.019860905061X";
    $cipher = MCRYPT_RIJNDAEL_128;
    $mode = MCRYPT_MODE_ECB;
    $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$mode),MCRYPT_RAND);
    echo "原文:".$str."<br>";
    $str_encrypt = mcrypt_encrypt($cipher,$key,$str,$mode,$iv);
    echo "加密后的内容是:".$str_encrypt."<br>";
    $str_decrypt = mcrypt_decrypt($cipher,$key,$str_encrypt,$mode,$iv);
    echo "解密后的内容:".$str_decrypt."<br>";

运行结果:

原文:我是李云
加密后的内容是:B@?�=(I辩蝣Z%
解密后的内容:我是李云

<1>由例子中可看到,使用PHP加密扩展库Mcrypt对数据加密和解密之前,首先创建了一个初始化向量,简称为iv。由 $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND);可见创建初始化 向 量需要两个参数:size指定了iv的大小;source为iv的源,其中值MCRYPT_RAND为系统随机数。

<2>函数mcrypt_get_iv_size($cipher,$modes)返回初始化向量大小,参数cipher和mode分别指算法和加 密模式。

<3>加密函数$str_encrypt = mcrypt_encrypt($cipher,$key,$str,$modes,$iv); 该函数的5个参数分 别如下:cipher——加密算法、key——密钥、data(str)——需要加密的数据、mode——算法模式、 iv——初始化向量

<4>解密函数 mcrypt_decrypt($cipher,$key,$str_encrypt,$modes,$iv); 该函数和加密函数的参数几乎 一样,唯一不同的是data,也就是说data为需要解密的数据$str_encrypt,而不是原始数据$str。

//手册里的写法:

    //指定初始化向量iv的大小:
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    //创建初始化向量:
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    //加密密码:
    $key = "123qwe.019860905061x";
    //原始内容(未加密):
    $text = "My name is Adam Li!";
    echo $text. "<br>\n";
    //加密后的内容:
    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv);
    echo $crypttext. "\n<br>";
    //解密已经加密的内容:
    $str_decrypt = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv);
    echo $str_decrypt;

下面是一个加/解密请求的例子:
$request_params = array(
 'controller' => 'todo',
 'action' => 'read',
 'username' => "bl",
 'userpass' => "a1"
);
$private_key = "28e336ac6c9423d946ba02d19c6a2632"; 
//encrypt request
$enc_request = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $private_key, json_encode($request_params), MCRYPT_MODE_ECB));
echo "CRYPT:".$enc_request."<br/>";
//decrypt request
$params = json_decode(trim(mcrypt_decrypt( MCRYPT_RIJNDAEL_256, $private_key, base64_decode($enc_request), MCRYPT_MODE_ECB )),true);
echo "ENCRYPT:<br/>";
//print result
var_dump($params);

注:加密和解密函数中的参数cipher、key和mode必须一一对应,否则数据不能被还原。
PHP 相关文章推荐
PHP输出控制功能在简繁体转换中的应用
Oct 09 PHP
谈谈新手如何学习PHP
Dec 14 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
php curl模拟post提交数据示例
Dec 31 PHP
php读取纯真ip数据库使用示例
Jan 26 PHP
php实现对两个数组进行减法操作的方法
Apr 17 PHP
php批量删除超链接的实现方法
Oct 19 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
ThinkPHP3.2.1图片验证码实现方法
Aug 19 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 PHP
Win下如何安装PHP的APC拓展
Aug 07 #PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 #PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 #PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 #PHP
一个漂亮的php验证码类(分享)
Aug 06 #PHP
如何在php中正确的使用json
Aug 06 #PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 #PHP
You might like
PHP 和 XML: 使用expat函数(一)
2006/10/09 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
Python重新引入被覆盖的自带function
2014/07/16 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
Python导入数值型Excel数据并生成矩阵操作
2020/06/09 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
葡萄牙语专业个人求职信
2013/12/10 职场文书
校运会广播稿100字
2014/01/27 职场文书
北京大学自荐信范文
2014/01/28 职场文书
生物制药专业求职信
2014/03/11 职场文书
投资建议书模板
2014/05/12 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL