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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
Feb 09 PHP
PHP编码规范的深入探讨
Jun 06 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
php结合js实现点击超链接执行删除确认操作
Oct 31 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
Nov 22 PHP
PHP递归实现层级树状展开
Apr 01 PHP
php实用代码片段整理
Nov 12 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
laravel 修改记住我功能的cookie保存时间的方法
Oct 14 PHP
thinkphp框架类库扩展操作示例
Nov 26 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蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php程序内部post数据的方法
2015/03/31 PHP
8个必备的PHP功能开发
2015/10/02 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
js实时监听文本框状态的方法
2011/04/26 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
python socket 超时设置 errno 10054
2014/07/01 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
在django中自定义字段Field详解
2019/12/03 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
党员的自我评价范文
2014/01/02 职场文书
学术会议主持词
2014/03/17 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2016年母亲节广告语
2016/01/28 职场文书
初中思想品德教学反思
2016/02/24 职场文书