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标准类库,可以在mcrypt.sourceforge 下载。该扩展的编译和安装方式和常规的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 * php实例代码解密使用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 ?> |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论