PHP动态加密解密[php源码]

(゜-゜)つロ 干杯~

这个模块是从可道云的代码中找到的,试了一下,非常好用!可用于对数据请求进行加密验证等。

通俗点说,用它来进行加密,同一个字符串,每次进行加密,得出的结果都是不一样的,大大加强了数据安全性。同时还可设定加密后数据的有效期,简直牛掰了。

食用方法

将下面的模块代码保存为 Mcrypt.class.php,然后在你需要用到的地方通过 require 的方式引入:

  1. <?php  
  2. require('Mcrypt.class.php'); //引入文件  
  3. $txt = Mcrypt::encode('要加密的内容','密匙',10);//加密内容,密匙,过期时间超过设置的时间后将无法解密/s  
  4. echo $txt.'</br>';  
  5. echo Mcrypt::decode($txt,'密匙');  

Mcrypt.class.php

  1. <?php  
  2.   
  3. *------  
  4. * 字符串加解密类;  
  5. * 一次一密;且定时解密有效  
  6. * 可用于加密&动态key生成  
  7. * demo:   
  8. * 加密:echo Mcrypt::encode('abc','123');  
  9. * 解密:echo Mcrypt::decode('9f843I0crjv5y0dWE_-uwzL_mZRyRb1ynjGK4I_IACQ','123');  
  10. */  
  11.    
  12. class Mcrypt{  
  13.     public $default_key = 'a!takA:dlmcldEv,e';  
  14.       
  15.     /** 
  16.      * 字符加密,一次一密,可定时解密有效 
  17.      *  
  18.      * @param string $string 原文 
  19.      * @param string $key 密钥 
  20.      * @param int $expiry 密文有效期,单位s,0 为永久有效 
  21.      * @return string 加密后的内容 
  22.      */  
  23.     public static function encode($string,$key = ''$expiry = 0){  
  24.         $ckeyLength = 4;  
  25.         $key = md5($key ? $key : $this->default_key); //解密密匙  
  26.         $keya = md5(substr($key, 0, 16));        //做数据完整性验证    
  27.         $keyb = md5(substr($key, 16, 16));       //用于变化生成的密文 (初始化向量IV)  
  28.         $keyc = substr(md5(microtime()), - $ckeyLength);  
  29.         $cryptkey = $keya . md5($keya . $keyc);    
  30.         $keyLength = strlen($cryptkey);  
  31.         $string = sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string . $keyb), 0, 16) . $string;  
  32.         $stringLength = strlen($string);  
  33.    
  34.         $rndkey = array();    
  35.         for($i = 0; $i <= 255; $i++) {    
  36.             $rndkey[$i] = ord($cryptkey[$i % $keyLength]);  
  37.         }  
  38.    
  39.         $box = range(0, 255);     
  40.         // 打乱密匙簿,增加随机性  
  41.         for($j = $i = 0; $i < 256; $i++) {  
  42.             $j = ($j + $box[$i] + $rndkey[$i]) % 256;  
  43.             $tmp = $box[$i];  
  44.             $box[$i] = $box[$j];  
  45.             $box[$j] = $tmp;  
  46.         }     
  47.         // 加解密,从密匙簿得出密匙进行异或,再转成字符  
  48.         $result = '';  
  49.         for($a = $j = $i = 0; $i < $stringLength$i++) {  
  50.             $a = ($a + 1) % 256;  
  51.             $j = ($j + $box[$a]) % 256;  
  52.             $tmp = $box[$a];  
  53.             $box[$a] = $box[$j];  
  54.             $box[$j] = $tmp;   
  55.             $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));  
  56.         }  
  57.         $result = $keyc . str_replace('=', ''base64_encode($result));  
  58.         $result = str_replace(array('+', '/', '='),array('-', '_', '.'), $result);  
  59.         return $result;  
  60.     }  
  61.    
  62.     /** 
  63.      * 字符解密,一次一密,可定时解密有效 
  64.      *  
  65.      * @param string $string 密文 
  66.      * @param string $key 解密密钥 
  67.      * @return string 解密后的内容 
  68.      */  
  69.     public static function decode($string,$key = '')  
  70.     {  
  71.         $string = str_replace(array('-', '_', '.'),array('+', '/', '='), $string);  
  72.         $ckeyLength = 4;  
  73.         $key = md5($key ? $key : $this->default_key); //解密密匙  
  74.         $keya = md5(substr($key, 0, 16));        //做数据完整性验证    
  75.         $keyb = md5(substr($key, 16, 16));       //用于变化生成的密文 (初始化向量IV)  
  76.         $keyc = substr($string, 0, $ckeyLength);  
  77.         $cryptkey = $keya . md5($keya . $keyc);    
  78.         $keyLength = strlen($cryptkey);  
  79.         $string = base64_decode(substr($string$ckeyLength));  
  80.         $stringLength = strlen($string);  
  81.    
  82.         $rndkey = array();    
  83.         for($i = 0; $i <= 255; $i++) {    
  84.             $rndkey[$i] = ord($cryptkey[$i % $keyLength]);  
  85.         }  
  86.    
  87.         $box = range(0, 255);  
  88.         // 打乱密匙簿,增加随机性  
  89.         for($j = $i = 0; $i < 256; $i++) {  
  90.             $j = ($j + $box[$i] + $rndkey[$i]) % 256;  
  91.             $tmp = $box[$i];  
  92.             $box[$i] = $box[$j];  
  93.             $box[$j] = $tmp;  
  94.         }  
  95.         // 加解密,从密匙簿得出密匙进行异或,再转成字符  
  96.         $result = '';  
  97.         for($a = $j = $i = 0; $i < $stringLength$i++) {  
  98.             $a = ($a + 1) % 256;  
  99.             $j = ($j + $box[$a]) % 256;  
  100.             $tmp = $box[$a];  
  101.             $box[$a] = $box[$j];  
  102.             $box[$j] = $tmp;   
  103.             $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));  
  104.         }  
  105.         if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0)  
  106.         && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)  
  107.         ) {  
  108.             return substr($result, 26);  
  109.         } else {  
  110.             return '';  
  111.         }   
  112.     }  
  113. }  
   

如果资源下载失效请到 留言板 留言或者 QQ 联系我。

本站默认解压密码:www.hibbba.com

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: