转载自: http://hi.baidu.com/ifuliaoyou/blog/item/f870570f22e13cec36d1220e.html

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支持四种块加密模型,简要说明如下:
    a. MCRYPT_MODE_ECB(electronic codebook) 适合对小数量随机数据的加密,比如加密用户的登录密码之类的。
    b. MCRYPT_MODE_CBC (cipher block chaining) 适合加密安全等级较高的重要文件类型。
    c. MCRYPT_MODE_CFB (cipher feedback) 适合于需要对数据流的每一个字节进行加密的场合。
    d. MCRYPT_MODE_OFB (output feedback, in 8bit) 和CFB模式兼容,但比CFB模式更安全。CFB模式会引起加密的错误扩散,如果一个byte出错,则其后续的所有byte都会出错。OFB模式则不会有此问题。但该模式的安全度不是很高,不建议使用。
    e. MCRYPT_MODE_NOFB (output feedback, in nbit) 和OFB兼容,由于采用了块操作算法,安全度更高。
    f. MCRYPT_MODE_STREAM 是为了WAKE或者RC4等流加密算法提供的额外模型。
    NOFB和STREAM仅当mycrypt的版本号大于等于libmcrypt-2.4.x才有效。(现在基本上都是大于这个版本了,libmcrypt的最新主版本已经到4了)

4.查看支持的算法和模型
    a. mcrypt_list_modes()列出当前环境支持的模型
    b. mcrypt_list_algorithms()列出当前环境支持的算法
    如命令行执行:

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

即可列出所有的结果。

    5.如何使用
    example1.

  1. <?php
  2. $key = "this is a secret key";
  3. $input = "Let us meet at 9 o'clock at the secret place.";
  4. $encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);
  5. ?>

最简单的方式如example1中所示,该方法表明对$input使用3DES的算法进行加密,加密密钥是$key.不过这中直接调用的方法已经不被官方推荐使用,也建议大家在开发中不要使用此种方式,不一定哪天该方法就不能用了。在php5下使用此种方式调用时,能看到一条warning信息,提示“PHP Warning: attempt to use an empty IV, which is NOT recommend”。
        上述过程完成了数据的加密过程。首先选择加密算法和加密模式创建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.一个简单功能的加密解密类

<?php
02 /**
03 * 使用mcrypt扩展 加密解密
04 *@author pangxl
05 * @version 1.0
06 */
07 classMcrypthash
08 {
09     /**
10      * 加密key
11      *
12      * @var string
13      * @access private
14      */
15     private$mAuthkey='T_test';
16
17     function__construct()
18     {
19         if(!function_exists('mcrypt_module_open')){
20             exit('Fatal error: no mcrypt module ');
21         }
22         $this->setMd5();
23     }
24
25     /**
26      * 使用MD5加密key
27      *
28      * @return unknown
29      */
30     privatefunctionsetMd5()
31     {
32         $this->mAuthkey=md5($this->mAuthkey);
33     }
34
35     /**
36      * 加密字符串
37      *
38      * @param string $value 加密的串
39      * @return string 加密后的结果
40      * @package McrypthashComponent
41      */
42     publicfunctionencrypt($value=null){
43         if(null==$value)returnfalse;
44         $td=mcrypt_module_open('tripledes','','ecb','');
45         $td_size=mcrypt_enc_get_iv_size($td);
46         $iv=mcrypt_create_iv($td_size,MCRYPT_RAND);
47         $key=substr($this->mAuthkey,0,$td_size);
48         mcrypt_generic_init($td,$key,$iv);
49         $ret=base64_encode(mcrypt_generic($td,$value));
50         mcrypt_generic_deinit($td);
51         mcrypt_module_close($td);
52         return$ret;
53     }
54
55     /**
56      * 解密过程
57      *
58      * @param string $value 解密的过程
59      * @return string
60      * @package McrypthashComponent
61      */
62     publicfunctiondecrypt($value=null)
63     {
64         if(null==$value)returnfalse;
65         $td=mcrypt_module_open('tripledes','','ecb','');
66         $td_size=mcrypt_enc_get_iv_size($td);
67         $iv=mcrypt_create_iv($td_size,MCRYPT_RAND);
68         $key=substr($this->mAuthkey,0,$td_size);
69         mcrypt_generic_init($td,$key,$iv);
70         $ret=trim(mdecrypt_generic($td,base64_decode($value)));
71         mcrypt_generic_deinit($td);
72         mcrypt_module_close($td);
73         return$ret;
74     }
75 }
76 ?>

[转] PHP之加解密: Mcrypt函数相关推荐

  1. 大三时候实现的,关于大整数(超过long范围)加减乘除操作的头文件,并包含了实现RSA加解密的函数...

    1 #include<iostream> 2 #include<time.h> 3 #include<string.h> 4 using namespace std ...

  2. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  3. Enigma加解密算法实现C++

    Enigma加解密算法实现C++ 刚刚接触密码学,就打算用C++实现一下Enigma的加解密.加密的思想就是非常经典的多表代换. 德国二战时期的密码系统:亚瑟·谢尔比乌斯 为了战胜enigma,英国在 ...

  4. 利用ENGINE替换OPENSSL中的加解密算法

    一:ENGINE的目的: ENGINE是OPENSSL预留的加载第三方加密库,主要包括了动态库加载的代码和加密函数指针管理的一系列接口.如果要使用Engine(假设你已经加载上该Engine了),那么 ...

  5. 云小课|使用SQL加密函数实现数据列的加解密

    摘要:数据加密作为有效防止未授权访问和防护数据泄露的技术,在各种信息系统中广泛使用.作为信息系统的核心,GaussDB(DWS)数仓也提供数据加密功能,包括透明加密和使用SQL函数加密. 本文分享自华 ...

  6. 使用 SQL 加密函数实现数据列的加解密

    数据加密作为有效防止未授权访问和防护数据泄露的技术,在各种信息系统中广泛使用.作为信息系统的核心,GaussDB (DWS) 数仓也提供数据加密功能,包括透明加密和使用 SQL 函数加密.这里主要讨论 ...

  7. 用Python写DES加解密的常用函数

    文章目录 生成pkcs(填充明文) 去掉填充 DES加密(ECB模式) DES解密(ECB模式) 请求包加密 请求包解密 响应包解密 响应包加密 class Burpy 备注 生成pkcs(填充明文) ...

  8. 互联网开发之神器:经典加解密函数Discuz authcode

    肉眼品世界导读:互联网开发里有一个很重要的业务,就是数据的安全性,而有的数据真正处理的时候又需要明文出现,那么安全的加解密就是一个非常重要的常见场景了,api 的token,关键数据的加密存储:php ...

  9. Openssl 对称加解密函数 - EVP_Cipher、EVP_Encrypt、EVP_Decryp 系列

    实验环境:openssl 1.1.1k EVP_CipherInit_ex().EVP_CipherUpdate() 和 EVP_CipherFinal_ex() 是可用于解密或加密的函数.执行的操作 ...

最新文章

  1. 2017 数据驱动大会豪华议程出炉,早鸟票一周内全部售罄
  2. c语言中switch语句流程图_C语言:C语言保留字(关键字)
  3. java \t怎么从头开始_通过这些简单的步骤从头开始学习Java
  4. python中的装饰器和抽象类
  5. 图的深度优先搜索(DFS)
  6. LeetCode-124.二叉树中的最大路径和
  7. YYText-swift,swift版的YYText,优化了yylabel和yytextview的部分扩展
  8. matlab香农编码,用MATLAB编程实现香农编码.doc
  9. 关于国内LTE宽带集群通信知识现状介绍
  10. 【山无遮,海无拦】LeetCode题集 线性枚举之最值算法
  11. dad my_My-dad我的爸爸英语绘本.ppt
  12. 微信公众平台账号名字修改方法
  13. 最全APP测试思想及流程要点,高薪测试人员一定要看
  14. Excel文件导入导出操作
  15. Unity程序框架总结归置系列(2)——对象池
  16. Xshell 常用配置
  17. Python 字符串应用详解(全网最详)
  18. Gitment给基于hexo的yilia主题的博客搭建免费评论系统
  19. 将idea中编译输出目录 classes 里的文件删掉,发现再次编译不能生成class文件
  20. 全国大学生英语竞赛培训:听力、词汇语法、完形填空、阅读理解、翻译、改错、IQ题、大小作文、语法等部分快速得分、备战策略和获奖技巧讲解!

热门文章

  1. Netty工作笔记0035---Reactor模式图剖析
  2. NodeJs学习笔记002--npm常用命令详解
  3. 如何删除win7Windows.old文件
  4. 正则表达式学习笔记006--转义符的认识与应用
  5. Pose-Aware Face Recognition in the Wild--填坑1
  6. 经典线程同步 事件Event
  7. librdkafka 安装
  8. 随想录(png的读取和显示)
  9. 嵌入式操作系统内核原理和开发(线程切换)
  10. python创建maven工程_Maven项目