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一句话cmdshell新型 (非一句话木马)
Apr 18 PHP
一个PHP的远程图片抓取函数分享
Sep 25 PHP
php解压文件代码实现php在线解压
Feb 13 PHP
ThinkPHP的MVC开发机制实例解析
Aug 23 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
May 16 PHP
php实现带读写分离功能的MySQL类完整实例
Jul 28 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 PHP
PHP中->和=>的意思
Mar 31 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
PHP 变量定义和变量替换的方法
2009/07/30 PHP
php标签云的实现代码
2012/10/10 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
PHP+Ajax实时自动检测是否联网的方法
2015/07/01 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
9个JavaScript评级/投票插件
2010/01/18 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
深入理解Django自定义信号(signals)
2018/10/15 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
python多进程重复加载的解决方式
2019/12/13 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
应聘医学检验人员自荐信
2013/09/27 职场文书
超市营业员求职简历的自我评价
2013/10/17 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
小学家长通知书评语
2014/12/31 职场文书
珍爱生命主题班会
2015/08/13 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python