php基于mcrypt的加密解密实例


Posted in PHP onOctober 27, 2014

本文实例讲述了php基于mcrypt实现加密解密的方法。分享给大家供大家参考。具体实现方法如下:

PHP中自带了相当多的加密的方法,这里我们来看一下mcrypt扩展的使用方式。也是在工作中需要用这个东西加密访问用户的Cookie的值,认真的学习了这个方面的内容。

1.简介

Mcrypt是PHP的一个扩展,完成了常用加密算法的封装。其实该扩展是对mcrypt标准类库的封装,mcrypt完成了相当多的常用加密算法,如DES, TripleDES, Blowfish (default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 和 GOST加密算法,并且提供了CBC、OFB、CFB 和 ECB 四种块加密的模型。

2.安装和使用

要使用该扩展,必须首先安装mcrypt标准类库,可以在http://mcrypt.sourceforge.net 下载。该扩展的编译和安装方式和常规的php扩展相同,不在详细说明了。

3.四种块加密模型

Mcrypt支持四种块加密模型,简要说明如下:

①. MCRYPT_MODE_ECB(electronic codebook) 适合对小数量随机数据的加密,比如加密用户的登录密码之类的。

②. MCRYPT_MODE_CBC (cipher block chaining) 适合加密安全等级较高的重要文件类型。

③. MCRYPT_MODE_CFB (cipher feedback) 适合于需要对数据流的每一个字节进行加密的场合。

④. MCRYPT_MODE_OFB (output feedback, in 8bit) 和CFB模式兼容,但比CFB模式更安全。CFB模式会引起加密的错误扩散,如果一个byte出错,则其后续的所有byte都会出错。OFB模式则不会有此问题。但该模式的安全度不是很高,不建议使用。

⑤. MCRYPT_MODE_NOFB (output feedback, in nbit) 和OFB兼容,由于采用了块操作算法,安全度更高。

⑥. MCRYPT_MODE_STREAM 是为了WAKE或者RC4等流加密算法提供的额外模型。

NOFB和STREAM仅当mycrypt的版本号大于等于libmcrypt-2.4.x才有效。(现在基本上都是大于这个版本了,libmcrypt的最新主版本已经到4了)

4.查看支持的算法和模型

①. mcrypt_list_modes()列出当前环境支持的模型

②. mcrypt_list_algorithms()列出当前环境支持的算法

如命令行执行:

php -r "var_dump(mcrypt_list_modes()); var_dump(mcrypt_list_algorithms());"

即可列出所有的结果。

5.如何使用

示例1:

<?php

$key = "this is a secret key";

$input = "Let us meet at 9 o'clock at the secret place.";

$encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);

?>

最简单的方式如示例1中所示,该方法表明对$input使用3DES的算法进行加密,加密密钥是$key.不过这中直接调用的方法已经不被官方推荐使用,也建议大家在开发中不要使用此种方式,不一定哪天该方法就不能用了。在php5下使用此种方式调用时,能看到一条warning信息,提示“PHP Warning: attempt to use an empty IV, which is NOT recommend”。

官方推荐的使用方式如示例2所示

示例2:

<?php

    $key = "this is a secret key";

    $input = "Let us meet at 9 o'clock at the secret place.";

    // 打开mcrypt,或者mcrypt类型的资源对象,该对象使用ecb模式,使用3des作为加密算法。

    $td = mcrypt_module_open('tripledes', '', 'ecb', '');

    // 创建iv(初始化向量)

    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

    // 根据密钥和iv初始化$td,完成内存分配等初始化工作

    mcrypt_generic_init($td, $key, $iv);

    // 进行加密

    $encrypted_data = mcrypt_generic($td, $input);

    // 反初始化$td,释放资源

    mcrypt_generic_deinit($td);

    // 关闭资源对象,退出

     mcrypt_module_close($td);

?>

上述过程完成了数据的加密过程。首先选择加密算法和加密模式创建mcrypt的资源对象和IV,然后初始化加密所需的buffer(内存),进行加密后再释放buffer,最后关闭资源对象。

解密的过程和加密是基本相同,只要把mcrypt_generic($td, $input)替换成mdecrypt_generic($td, $input)就可以了,其它部分完全相同。当然,对于3des这种对称加密算法而言,加密、解密所用的key是必须完全相同的。

6. 有关IV

不是所有的模型中都需要IV. CFB和OFB是必须有IV, CBC和EBC则是可选的。对于必选IV的模式来说,其加密和解密的IV的值必须完全相同,CBC和EBC则无此要求。可以相同也可以不同,没什么关系。

7.一个简单功能的加密解密类

class AMPCrypt {

    private static function getKey(){

        return md5('exampleKey');

     }

    public static function encrypt($value){

         $td = mcrypt_module_open('tripledes', '', 'ecb', '');

         $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);

         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));

         mcrypt_generic_init($td, $key, $iv);

         $ret = base64_encode(mcrypt_generic($td, $value));

         mcrypt_generic_deinit($td);

         mcrypt_module_close($td);

        return $ret;

     }

    public static function dencrypt($value){

         $td = mcrypt_module_open('tripledes', '', 'ecb', '');

         $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);

         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));

         $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td));

         mcrypt_generic_init($td, $key, $iv);

         $ret = trim(mdecrypt_generic($td, base64_decode($value))) ;

         mcrypt_generic_deinit($td);

         mcrypt_module_close($td);

        return $ret;

     }

}
PHP 相关文章推荐
php中处理模拟rewrite 效果
Dec 09 PHP
PHP实现MySQL更新记录的代码
Jun 07 PHP
php 采集书并合成txt格式的实现代码
Mar 01 PHP
PHP 面向对象 PHP5 中的常量
May 05 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
Oct 17 PHP
PHP动态分页函数,PHP开发分页必备啦
Nov 07 PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
Codeigniter框架实现获取分页数据和总条数的方法
Dec 05 PHP
PHP技术开发微信公众平台
Jul 22 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 #PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
Oct 27 #PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 #PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 #PHP
Linux下安装PHP MSSQL扩展教程
Oct 24 #PHP
Windows下的PHP安装pear教程
Oct 24 #PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
Oct 24 #PHP
You might like
一贴学会PHP 新手入门教程
2009/08/03 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
div层的移动及性能优化
2010/11/16 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
小程序实现授权登陆的解决方案
2018/12/02 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
原生javascript单例模式的应用实例分析
2020/02/23 Javascript
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
python 通过文件夹导入包的操作
2020/06/01 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
Python join()函数原理及使用方法
2020/11/14 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
yy司仪主持词
2014/03/22 职场文书
个人担保书范文
2014/05/20 职场文书
个人总结怎么写
2015/02/26 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书