1. 程式人生 > >幾種簡易實用的PHP加解密技術(凱撒移位加密,生成邀請碼,文字加密)

幾種簡易實用的PHP加解密技術(凱撒移位加密,生成邀請碼,文字加密)

偏移 必須 right box rev intval UNC print 函數

  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 }

幾種簡易實用的PHP加解密技術(凱撒移位加密,生成邀請碼,文字加密)