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 相关文章推荐
建立动态的WML站点(一)
Oct 09 PHP
PHP4与PHP3中一个不兼容问题的解决方法
Oct 09 PHP
PHP以及MYSQL日期比较方法
Nov 29 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 PHP
laravel安装zend opcache加速器教程
Mar 02 PHP
PHP多文件上传类实例
Mar 07 PHP
php实现cookie加密的方法
Mar 10 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
PHP使用Nginx实现反向代理
Sep 20 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
php遍历目录下文件并按修改时间排序操作示例
Jul 12 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
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
Prototype使用指南之range.js
2007/01/10 Javascript
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
详解JavaScript函数
2015/12/01 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
Bootstrop实现多级下拉菜单功能
2016/11/24 Javascript
JavaScript适配器模式详解
2017/10/19 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
常用python数据类型转换函数总结
2014/03/11 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
python实现图片文件批量重命名
2020/03/23 Python
Python函数返回不定数量的值方法
2019/01/22 Python
python机器学习库xgboost的使用
2020/01/20 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
安全生产投入制度
2014/01/29 职场文书
高中教师评语大全
2014/04/25 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
工作失职检讨书
2015/01/26 职场文书