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模拟HTTP认证
Oct 09 PHP
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
Sep 10 PHP
php 计算两个时间戳相隔的时间的函数(小时)
Dec 18 PHP
PHP截断标题且兼容utf8和gb2312编码
Sep 22 PHP
php下拉选项的批量操作的实现代码
Oct 14 PHP
PHP捕获Fatal error错误的方法
Jun 11 PHP
编写PHP脚本过滤用户上传的图片
Jul 03 PHP
php批量删除超链接的实现方法
Oct 19 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 PHP
Django 中 cookie的使用
Aug 17 PHP
PHP使用SMTP邮件服务器发送邮件示例
Aug 28 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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安装threads多线程扩展基础教程
2015/11/17 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
python执行子进程实现进程间通信的方法
2015/06/02 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
基层工作经验证明样本
2014/11/16 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
2015年超市工作总结
2015/04/09 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL
Python字符串的转义字符
2022/04/07 Python