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支持四种块加密模型,简要说明如下:


    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 class Mcrypthash
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     private function setMd5 ()
31     {
32         $this -> mAuthkey = md5 ( $this -> mAuthkey );
33     }
34
35     /**
36      * 加密字符串
37      *
38      * @param string $value 加密的串
39      * @return string 加密后的结果
40      * @package McrypthashComponent
41      */
42     public function encrypt ( $value = null ){
43         if ( null == $value ) return false ;
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     public function decrypt ( $value = null )
63     {
64         if ( null == $value ) return false ;
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 ?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值