当前位置:首页 > PHP教程 > php应用 > 列表

php基于mcrypt的加密解密实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-18 22:15:09 浏览: 评论:0 

这篇文章主要介绍了php基于mcrypt的加密解密的实现方法,以实例形式分析了mcrypt加密解密的原理与具体实现方法,非常具有实用价值,需要的朋友可以参考下

本文实例讲述了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:

  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. ?> 

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

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

示例2:

  1. <?php 
  2.     $key = "this is a secret key"
  3.     $input = "Let us meet at 9 o'clock at the secret place."
  4.     // 打开mcrypt,或者mcrypt类型的资源对象,该对象使用ecb模式,使用3des作为加密算法。 
  5.     $td = mcrypt_module_open('tripledes''''ecb'''); 
  6.     // 创建iv(初始化向量) 
  7.     $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
  8.     // 根据密钥和iv初始化$td,完成内存分配等初始化工作 
  9.     mcrypt_generic_init($td$key$iv); 
  10.     // 进行加密 
  11.     $encrypted_data = mcrypt_generic($td$input); 
  12.     // 反初始化$td,释放资源 
  13.     mcrypt_generic_deinit($td); 
  14.     // 关闭资源对象,退出 
  15.      mcrypt_module_close($td); 
  16. ?> 
  17.  

上述过程完成了数据的加密过程。首先选择加密算法和加密模式创建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.一个简单功能的加密解密类,代码如下:

  1. class AMPCrypt { 
  2.     private static function getKey(){ 
  3.         return md5('exampleKey'); 
  4.      } 
  5.     public static function encrypt($value){ 
  6.          $td = mcrypt_module_open('tripledes''''ecb'''); 
  7.          $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM); 
  8.          $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td)); 
  9.          mcrypt_generic_init($td$key$iv); 
  10.          $ret = base64_encode(mcrypt_generic($td$value)); 
  11.          mcrypt_generic_deinit($td); 
  12.          mcrypt_module_close($td); 
  13.         return $ret
  14.      } 
  15.     public static function dencrypt($value){ 
  16.          $td = mcrypt_module_open('tripledes''''ecb'''); 
  17.          $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM); 
  18.          $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td)); 
  19.          $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td)); 
  20.          mcrypt_generic_init($td$key$iv); 
  21.          $ret = trim(mdecrypt_generic($tdbase64_decode($value))) ; 
  22.          mcrypt_generic_deinit($td); 
  23.          mcrypt_module_close($td); 
  24.         return $ret
  25.      } 

Tags: mcrypt加密解密

分享到: