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实现多服务器共享SESSION数据的方法
Mar 16 PHP
apache和php之间协同工作的配置经验分享
Apr 08 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
Aug 06 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
May 27 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
PHP小偷程序的设计与实现方法详解
Oct 15 PHP
Yii全局函数用法示例
Jan 22 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
PHP执行linux命令6个函数代码实例
Nov 24 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
基于mysql的论坛(3)
2006/10/09 PHP
8个出色的WordPress SEO插件收集
2011/02/26 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python如何查看系统网络流量的信息
2016/09/12 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
药剂专业自荐书
2014/06/20 职场文书
2014年秘书工作总结
2014/11/25 职场文书
2015年采购部工作总结
2015/04/23 职场文书
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB