一个PHP针对数字的加密解密类

定义机密类

 1 <?php
 2 /**
 3  * 加密解密类
 4  * 该算法仅支持加密数字。比较适用于数据库中id字段的加密解密,以及根据数字显示url的加密。
 5  * @author 深秋的竹子
 6  * @version alpha
 7  * @加密原则 标记长度 + 补位 + 数字替换
 8  * @加密步骤:
 9  * 将a-z,A-Z,0-9 62个字符打乱,取前M(数字最大的位数)位作为 标记长度字符串,取第M+1 到第M+10位为数字替换字符串,剩余的为补位字符串
10  * 1.计算数字长度n,取乱码的第n位作为标记长度。
11  * 2.计算补位的长度,加密串的长度N -1 - n 为补位的长度。根据指定的算法得到补位字符串。
12  * 3.根据数字替换字符串替换数字,得到数字加密字符串。
13  * 标记长度字符 + 补位字符串 + 数字加密字符串 = 加密串
14  * Usage:
15  *   $obj = new XDeode(9);
16  *   $e_txt = $obj->encode(123);
17  *   echo $e_txt.'<br/>';
18  *   echo $key->decode($e_txt);
19  */
20 namespace Util\XDeode;
21 class XDeode{
22     private $strbase = "Flpvf70CsakVjqgeWUPXQxSyJizmNH6B1u3b8cAEKwTd54nRtZOMDhoG2YLrI";
23     private $key,$length,$codelen,$codenums,$codeext;
24     function __construct($length = 9,$key = 2543.5415412812){
25         $this->key = $key;
26         $this->length = $length;
27         $this->codelen = substr($this->strbase,0,$this->length);
28         $this->codenums = substr($this->strbase,$this->length,10);
29         $this->codeext = substr($this->strbase,$this->length + 10);
30     }
31 
32 
33     function encode($nums){
34         $rtn = "";
35         $numslen = strlen($nums);
36         //密文第一位标记数字的长度
37         $begin = substr($this->codelen,$numslen - 1,1);
38 
39         //密文的扩展位
40         $extlen = $this->length - $numslen - 1;
41         $temp = str_replace('.', '', $nums / $this->key);
42         $temp = substr($temp,-$extlen);
43 
44         $arrextTemp = str_split($this->codeext);
45         $arrext = str_split($temp);
46         foreach ($arrext as $v) {
47             $rtn .= $arrextTemp[$v];
48         }
49 
50         $arrnumsTemp = str_split($this->codenums);
51         $arrnums = str_split($nums);
52         foreach ($arrnums as $v) {
53             $rtn .= $arrnumsTemp[$v];
54         }
55         return $begin.$rtn;
56     }
57 
58 
59     function decode($code){
60 
61         $begin = substr($code,0,1);
62         $rtn = '';
63         $len = strpos($this->codelen,$begin);
64         if($len!== false){
65             $len++;
66             $arrnums = str_split(substr($code,-$len));
67             foreach ($arrnums as $v) {
68                 $rtn .= strpos($this->codenums,$v);
69             }
70         }
71 
72         return $rtn;
73     }
74 }

调用类

1  $obj = new \Util\XDeode\XDeode(6);
2         $cache['pids'] = $cache[0]['pids'] + 1000;
3         $cache['invite'] = $obj->encode($cache['pids']);
4         $cache['oen'] = $obj->decode($cache['invite']);
5         $cache['oen'] = $cache['oen'] -1000;
 1 /**** 示例  ****/
 2 $begin = 9950;
 3 $end = $begin + 50;
 4 $obj = new XDeode(9);
 5 for($i=$begin;$i<$end;$i++){
 6   $en = $obj->encode($i);
 7   $de = $obj->decode($en);
 8   echoln("[{$i}]=[{$en}]=[{$de}]");
 9 }
10 
11 function echoln($str){
12   echo "{$str}<br/>";
13 }

运行示例结果:

 

[9950]=[vmizxPPga]=[9950]
[9951]=[vSNSSPPgk]=[9951]
[9952]=[vNQNyPPgV]=[9952]
[9953]=[vyyJJPPgj]=[9953]
[9954]=[vNzQzPPgq]=[9954]
[9955]=[vyNzmPPgg]=[9955]
[9956]=[vXxSNPPge]=[9956]
[9957]=[vXJJJPPgW]=[9957]
[9958]=[vXziQPPgU]=[9958]
[9959]=[viXxSPPgP]=[9959]
[9960]=[vQxmyPPea]=[9960]
[9961]=[viJyJPPek]=[9961]

posted @ 2018-08-15 17:04  顾遥  阅读(344)  评论(0)    收藏  举报