带时间戳算法-----类似authcode开源算法

   

      有时候,你需要对加密的字符串加上时间限制。 比如一个小时后失效。类似这种需求, 利用开源算法authcode会很好用, 可是它会出现一些特殊字符串,并且出现解密失效的情况。   

     别人的算法看起来费劲,改起来更费劲, 不如自己写个简单的,直接上代码

[php]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.  /** 
  2.  * 算法思路。 
  3.  * 0、遍历将$a的每位字符都先获取ascii码,再加上2,再返回该值对应的字符 
  4.  * 1、获取$a的长度 $b,再将$b转化为16进制。 
  5.  * 2、再求$b的长度 $c,再将$c转化为16进制。$c的长度将为1位。因为$a的长度不允许达到16的15次幕 
  6.  * 3、将用户传入的时间戳 加上当前时间戳得到$time. 
  7.  * 4、再将用户传入的密钥进行一定规则编码得到$d , 
  8.  * 5、定义不重复的9位字符串$m, 再对$time进行从后到前循环循环。 
  9.  * 每次循环拿到 $m[$time[$i-1]] 再将其拼装起来得到 $times。 因为$time每位的值肯定不会超过9. 所以不会有超出长度的问题 
  10.  * 6、生成一个 位数(1-10)随机 的 随机字符串 $f 
  11.  * 7、$res = $c.$times.$b.$a.$f; 
  12.  * 8、再将$res 按照规则来打散及重新拼装。如字符串 12345678 ,最后一位,第一位。倒数第二位。第二位....最终得到81726354. 
  13.  * 
  14.  * 带时间戳算法加密(不限长度) 
  15.  * @param $a    待加密字符串 
  16.  * @param int $time   加密时长 
  17.  * @param $key   密钥 
  18.  */  
  19. public  static  function auth_encode($a,$time=0,$key){  
  20.     $keya = md5 ( substr ( $key, 0, 16 ) );  
  21.     $keyb = md5 ( substr ( $key, 16, 16 ) );  
  22.     $key = md5($keya.$keyb.substr($key,0,10));  
  23.   
  24.     for($i=0,$n=strlen($a);$i<$n;$i++){  
  25.         $a[$i] = chr(ord($a[$i])+2);  
  26.     }  
  27.   
  28.     $time = $time ? ($time + time()): time();  
  29.     $time = (string) sprintf("%012d",$time);  
  30.     $strlen = dechex(strlen($a));        //代表字符串的长度  
  31.     $strlen1 =  dechex(strlen($strlen));     //保证字符串长度的长度是一位。 因为此数最大15, 而字符串的长度可达到16的15次幕。所以绝对够用。  
  32.     $times = "";  
  33.     $str = "UsHlpba8nD";  
  34.     for($i=12;$i>0;$i--){  
  35.         $times .= $str[$time[$i-1]];  
  36.     }  
  37.     $res = $strlen1.$times.$strlen.$a.$key.self::rands(rand(1,10));  
  38.     $return = "";  
  39.     for($i=0,$n=strlen($res);$i<ceil($n/2);$i++){  
  40.         if($n-$i-1 == $i ){   //如果字符长度为  
  41.             $return .= $res[$i];  
  42.         }else{  
  43.             $return .= $res[$n-$i-1].$res[$i];  
  44.         }  
  45.     }  
  46.     return urlencode($return);  
  47. }  
  48.   
  49.   
  50. /** 
  51.  * 对于上面的方法去进行解密 
  52.  * 自定义带时间戳算法解密 
  53.  * @param $a 
  54.  * @param $key 
  55.  */  
  56. public static function auth_decode($a,$key){  
  57.     $a = urldecode($a);  
  58.     $keya = md5 ( substr ( $key, 0, 16 ) );  
  59.     $keyb = md5 ( substr ( $key, 16, 16 ) );  
  60.     $key = md5($keya.$keyb.substr($key,0,10));  
  61.     $return = "";  
  62.     for($i=1,$n=strlen($a);$i<=floor($n/2);$i++){  
  63.         $return .= $a[2*$i-1];  
  64.     }  
  65.     for($i=ceil(strlen($a)/2);$i>0;$i--){  
  66.         $return .= $a[2*$i-2];  
  67.     }  
  68.     $strlen1 = hexdec(substr($return,0,1));  
  69.     $times =  substr($return,1,12) ;  
  70.     $strlen = hexdec(substr($return,13,$strlen1));   //真正有用的字符串长度  
  71.     $code = substr($return,(13+$strlen1),$strlen);  
  72.     $time = "";  
  73.     for($i=strlen($times);$i>0;$i--){  
  74.          $time .= strpos("UsHlpba8nD",$times[$i-1]);  
  75.     }  
  76.     $time = (int) $time;  
  77.     if($time < time()){  
  78.         return 0;//代表过期  
  79.     }  
  80.     if(strpos(substr($return,(13+$strlen+$strlen1)),$key) ===0 ){  
  81.         for($i=0,$n=strlen($code);$i<$n;$i++){  
  82.             $code[$i] = chr(ord($code[$i])-2);  
  83.         }  
  84.   
  85.         return $code;  
  86.     }else{  
  87.         return false;  //密钥不等  
  88.     }  
  89.   
  90. }  
  91.   
  92.     /** 
  93.  * 随机生成 $n位字符 
  94.  * @param $n 
  95.  * @return string 
  96.  */  
  97. private static function rands($n){  
  98.     $randstirng ="abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRST";  
  99.     $returns = "";  
  100.     for($i=0;$i<$n;$i++){  
  101.         $rand = rand(0,strlen($randstirng)-1);  
  102.         $returns .= $randstirng[$rand];  
  103.     }  
  104.     return $returns;  
  105. }  

     当然此算法并不够完美,还是会出现特殊字符,但保证能够完美解密

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值