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核心代码分析require和include的区别
Jan 02 PHP
基于php-fpm 参数的深入理解
Jun 03 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
php从字符串创建函数的方法
Mar 16 PHP
php数组随机排序实现方法
Jun 13 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
php技术实现加载字体并保存成图片
Jul 27 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
php文件上传后端处理小技巧
May 22 PHP
PHP实现读取文件夹及批量重命名文件操作示例
Apr 15 PHP
Laravel validate error处理,ajax,json示例
Oct 25 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新手上路(五)
2006/10/09 PHP
利用php获取服务器时间的实现代码
2013/06/07 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
详解angularjs popup-table 弹出框表格指令
2017/09/20 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
python基于SMTP协议发送邮件
2019/05/31 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
python空元组在all中返回结果详解
2020/12/15 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
前台文员岗位职责及工作流程
2013/11/19 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
股权投资意向书
2014/04/01 职场文书
2014年客服工作总结与计划
2014/12/09 职场文书
婚礼答谢词范文
2015/09/29 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
python munch库的使用解析
2021/05/25 Python
Java版 简易五子棋小游戏
2022/05/04 Java/Android