PHP可逆加密函数
后端笔记 2017-06-26 09:35:26

 简洁版:

很多时候我们需要对数据进行加密解密,比如有些数据需要保存到cookie中,但又不能被用户轻易得到这些数据,这时我们就需要加密这些数据保存到cookie中,等我们需要使用它们的时候再解密。
加密的过程如下:

PHP Code复制内容到剪贴板
  1. //加密数据并写到cookie里    
  2. $cookie_data = $this -> encrypt("nowamagic"$data);    
  3. $cookie = array(    
  4. 'name' => '$data',    
  5. 'value' => $cookie_data,    
  6. 'expire' => $user_expire,    
  7. 'domain' => '',    
  8. 'path' => '/',    
  9. 'prefix' => ''    
  10. );    
  11. $this->input->set_cookie($cookie);    
  12. //加密    
  13. public function encrypt($key$plain_text) {    
  14. $plain_text = trim($plain_text);    
  15. $iv = substr(md5($key), 0,mcrypt_get_iv_size (MCRYPT_CAST_256,MCRYPT_MODE_CFB));    
  16. $c_t = mcrypt_cfb (MCRYPT_CAST_256, $key$plain_text, MCRYPT_ENCRYPT, $iv);    
  17. return trim(chop(base64_encode($c_t)));    
  18. }    

使用的时候再解密:

PHP Code复制内容到剪贴板
  1. if( isset($_COOKIE['data']) ){    
  2. //用cookie给session赋值    
  3. $_SESSION['data'] = decrypt("nowamagic"$_COOKIE['data']);    
  4. }    
  5. function decrypt($key$c_t) {    
  6. $c_t = trim(chop(base64_decode($c_t)));    
  7. $iv = substr(md5($key), 0,mcrypt_get_iv_size (MCRYPT_CAST_256,MCRYPT_MODE_CFB));    
  8. $p_t = mcrypt_cfb (MCRYPT_CAST_256, $key$c_t, MCRYPT_DECRYPT, $iv);    
  9. return trim(chop($p_t));    
  10. }    

 


升级版:

可逆加密函数改dz的支持数组。

PHP Code复制内容到剪贴板
  1. <?php  
  2. /** 
  3. $data 原文或者密文支持数组 
  4. $operation 操作(0 | 1), 默认为0解密 
  5. $key 密钥 
  6. $expiry密文有效期, 加密时候有效, 单位 秒,0 为永久有效 
  7. */  
  8. header("Content-type:text/html;charset=utf-8");  
  9. function authcode($data,$key='www.phpin.net',$operation=0,$expiry=0){  
  10.     $ckey_length=6;  
  11.     $keya=sha1($key);  
  12.     $keyb=substr(md5($key),$ckey_length);   
  13.     $data=$operation==0?$data:serialize($data);  
  14.     $keyc=$ckey_length ? ($operation==0 ? substr($data,0,$ckey_length):substr(md5(microtime()),-$ckey_length)):'';  
  15.     $cryptkey=$keya.md5($keya.$keyc);  
  16.     $key_length=strlen($cryptkey);  
  17.     $data=$operation==0 ? base64_decode(substr($data,$ckey_length)):sprintf('%010d',$expiry ? $expiry+time():0).substr(md5($data.$keyb),0,16).$data;  
  18.     $data_length=strlen($data);  
  19.     $result='';  
  20.     $box=range(0,255);  
  21.     $rndkey=array();  
  22.     for($i=0;$i<=255;$i++){  
  23.         $rndkey[$i]=ord($cryptkey[$i%$key_length]);  
  24.     }  
  25.     for($j=$i=0;$i<256;$i++){  
  26.         $j=($j+$box[$i]+$rndkey[$i])%256;  
  27.         $tmp=$box[$i];  
  28.         $box[$i]=$box[$j];  
  29.         $box[$j]=$tmp;  
  30.     }  
  31.     for($a=$j=$i=0;$i<$data_length;$i++){  
  32.         $a=($a+1)%256;  
  33.         $j=($j+$box[$a])%256;  
  34.         $tmp=$box[$a];  
  35.         $box[$a]=$box[$j];  
  36.         $box[$j]=$tmp;  
  37.         $result.=chr(ord($data[$i]) ^ ($box[($box[$a]+$box[$j])%256]));  
  38.     }  
  39.     if($operation==0){  
  40.         if((substr($result,0,10)==0||substr($result,0,10)-time()>0)&&substr($result,10,16)==substr(md5(substr($result,26).$keyb),0,16)){  
  41.             return unserialize(substr($result,26));  
  42.         }else{  
  43.             return '';  
  44.         }  
  45.     }else{  
  46.         return $keyc.str_replace('=','',base64_encode($result));  
  47.     }  
  48.   
  49. }  
  50.   
  51. echo  $a = authcode(array(1,'fsdg',3),'www.yonglan.net',1);  
  52. echo '<br />';  
  53. $b = authcode($a,'www.yonglan.net');  //支持数组  
  54. print_r($b);  
  55. echo '<br />';  
  56. echo $a = authcode('15128282867''key', 1,3600);  
  57. echo '<br />';  
  58. echo  $b = authcode($a'key'); // 在一个小时内,$b(abc),否则 $b 为空  
  59. echo '<br />';  

 

 

 

本文来自于:http://www.phpin.net/thread-233-1-1.html

Powered by yoyo苏ICP备15045725号