1 <?php
  2 namespace controller;
  3 
  4 /**
  5  * 加密工具类
  6  */
  7 class CodeTool
  8 {
  9 
 10     /**
 11      * 将数字加密为七位数的字符(用于生成推荐码)
 12      * @param mixed $msg   需要加密或者解密的信息, 加密的话,必须为数字
 13      * @return int|string
 14      */
 15     public static function autoNumCode($msg){
 16         $baseChar = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
 17         $init = 123456789;
 18         $hex  = 32;
 19         if (is_numeric($msg)) {
 20             $msg += $init;
 21             $str = str_pad($msg, 10, '0', STR_PAD_LEFT);
 22             $num1 = intval($str[0].$str[2].$str[6].$str[9]);
 23             $num2 = intval($str[1].$str[3].$str[4].$str[5].$str[7].$str[8]);
 24             $str1 = $str2 = '';
 25             while ($num1!=0){
 26                 $tmp = $num1 % $hex;
 27                 $str1 .= $baseChar[$tmp];
 28                 $num1 = intval($num1/$hex);
 29             }
 30             while ($num2!=0){
 31                 $tmp = $num2 % $hex;
 32                 $str2 .= $baseChar[$tmp];
 33                 $num2 = intval($num2/$hex);
 34             }
 35             $str1 = strrev($str1);
 36             $str2 = strrev($str2);
 37             return str_pad($str1,3,'U',STR_PAD_RIGHT).str_pad($str2,4,'L',STR_PAD_RIGHT);
 38         } else {
 39             $str1 = trim(substr($msg,0,3),'U');
 40             $str2 = trim(substr($msg,3,4),'L');
 41             $charArr = array_flip(str_split($baseChar));
 42             $num1 = $num2 = 0;
 43             for ($i=0;$i<=strlen($str1)-1;$i++)
 44             {
 45                 $v = substr($str1,$i,1);
 46                 if(!isset($charArr[$v])) return '';
 47                 $num1 += $charArr[$v]*pow($hex,strlen($str1)-$i-1);
 48             }
 49             for ($i=0;$i<=strlen($str2)-1;$i++)
 50             {
 51                 $v = substr($str2,$i,1);
 52                 if(!isset($charArr[$v])) return '';
 53                 $num2 += $charArr[$v]*pow($hex,strlen($str2)-$i-1);
 54             }
 55             $str1 = str_pad($num1,4,'0',STR_PAD_LEFT);
 56             $str2 = str_pad($num2,6,'0',STR_PAD_LEFT);
 57             $rid = ltrim($str1[0].$str2[0].$str1[1].$str2[1].$str2[2].$str2[3].$str1[2].$str2[4].$str2[5].$str1[3],'0');
 58             $rid -= $init;
 59             return $rid;
 60         }
 61     }
 62 
 63 
 64     /**
 65      * 凯撒加密(移位加密算法,加密英文)
 66      * @param string $str    待加(解)密字符
 67      * @param string $type   类型 ENCODE 生成, DECODE 解析地址生成uid
 68      * @param int    $offset 偏移量
 69      */
 70     public static function CaesarCode($str, $type='DECODE', $offset = 10)
 71     {
 72         $preg_status = preg_match('/^[a-zA-Z]+$/', $str);
 73         if (!$preg_status) {
 74             return false;
 75         }
 76         $return = "";
 77         for ( $i = 0; $i < strlen($str); $i++) {
 78             $c = ord($str[$i]);
 79             if ($type == 'ENCODE') {
 80                 $c += $offset % 26;
 81             } else {
 82                 $c -= $offset % 26;
 83             }
 84             if ($str[$i] >= 'a' && $str[$i] <= 'z')
 85             {
 86                 if (chr($c) < 'a')
 87                     $c += 26;
 88                 if (chr($c) > 'z')
 89                     $c -= 26;
 90             } else if ($str[$i] >= 'A' && $str[$i] <= 'Z') {
 91                 if (chr($c) < 'A')
 92                     $c += 26;
 93                 if (chr($c) > 'Z')
 94                     $c -= 26;
 95             }
 96             $return .= chr($c);
 97         }
 98         return $return;
 99     }
100 
101 
102     /**
103      * 将文本内容加密成一串字符,可解密
104      * @param string $str
105      * @param string $type
106      * @param string $key
107      * @param int $v
108      * @return bool|string
109      */
110     public static function autoCode($str, $type = 'DECODE', $key = '', $v = 0)
111     {
112         $clength = 4;
113         $key = md5($key ? $key : config('config.authkey'));
114         $keya = md5(substr($key, 0, 16));
115         $keyb = md5(substr($key, 16, 16));
116         $keyc = $clength ? ($type == 'DECODE' ? substr($str, 0, $clength): substr(md5(microtime()), -$clength)) : '';
117         $cryptkey = $keya.md5($keya.$keyc);
118         $key_length = strlen($cryptkey);
119         $str = $type == 'DECODE' ? base64_decode(substr($str, $clength)) : sprintf('%010d', $v ? $v + time() : 0).substr(md5($str.$keyb), 0, 16).$str;
120         $str_length = strlen($str);
121         $result = '';
122         $box = range(0, 255);
123         $rndkey = array();
124         for($i = 0; $i <= 255; $i++) {
125             $rndkey[$i] = ord($cryptkey[$i % $key_length]);
126         }
127         for($j = $i = 0; $i < 256; $i++) {
128             $j = ($j + $box[$i] + $rndkey[$i]) % 256;
129             $tmp = $box[$i];
130             $box[$i] = $box[$j];
131             $box[$j] = $tmp;
132         }
133         for($a = $j = $i = 0; $i < $str_length; $i++) {
134             $a = ($a + 1) % 256;
135             $j = ($j + $box[$a]) % 256;
136             $tmp = $box[$a];
137             $box[$a] = $box[$j];
138             $box[$j] = $tmp;
139             $result .= chr(ord($str[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
140         }
141         if($type == 'DECODE') {
142             if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
143                 return substr($result, 26);
144             } else {
145                 return '';
146             }
147         } else {
148             return $keyc.str_replace('=', '', base64_encode($result));
149         }
150     }
151 
152     /**
153      * 随机字符串 (用于生成钱包地址)
154      */
155     public static function randCode($len = 30)
156     {
157         $str = '';
158         $ascii = array_merge(range(48,57), range(97,122), range(65,90));
159         for ($i = 0; $i < $len; $i++) {
160             $str .= chr($ascii[mt_rand(0, count($ascii)-1)]);
161         }
162         return '0x'.$str;
163     }
164 
165 
166     /**
167      * 驼峰转下划线或者下划线转驼峰式命名
168      * @param string $name 函数名或变量名
169      * @return string
170      */
171     public static function  tranFunName($name)
172     {
173         if (strpos($name, '_') !== false) {
174             $return_name = str_replace('_', " ", strtolower($name));
175             return ltrim(str_replace(" ", "", ucwords($return_name)), '_' );
176         } else {
177             return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . '_' . "$2", $name));
178         }
179     }
180 
181 
182 }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。