一個簡單的圖片加解密函數
使用client跑,不要使用浏覽器跑
qq845875470 ,技術交流
1 <?php 2 /** 3 * Created by hello. 4 * User: qq 845875470 5 * Date: 2016/4/2 6 * Time: 11:21 7 */ 8 9 $notice = <<<A 10 為了穩定性,必須在客戶端跑 11 格式 :php path=D:/xxx/uuu type=en is_copy=1 salt=xxx 12 參數使用空格分開 13 path -- 路徑 必須寫 14 type -- en加密, de為解密 必須寫 15 is_copy -- 1為復制,0為轉移, 不寫默認為轉移 16 salt -- 加密鑰匙 加密用什麼,解密就用什麼 不寫默認為salt 17 A; 18 19 //如果不是客戶端 20 if(PHP_SAPI != 'cli') {echo $notice;die;} 21 22 //獲取參數 23 $arr = parse_parameter($argv); 24 25 //如果路徑沒設置 26 if(!isset($arr['path']) || !isset($arr['type'])) {echo $notice;die;} 27 //如果is_dir沒設置 28 if(!isset($arr['is_copy'])) {$arr['is_copy'] = '';} 29 //如果salt沒設置 30 if(!isset($arr['salt'])) {$arr['salt'] = '';} 31 32 //type為en就加密 33 if($arr['type'] == "en") img_enconde($arr['path'], $arr['is_copy'], $arr['salt']); 34 //type為de就解密 35 if($arr['type'] == "de") img_deconde($arr['path'], $arr['is_copy'], $arr['salt']); 36 37 38 function parse_parameter($argv) 39 { 40 $arr = array(); 41 //獲取參數 42 for($len=count($argv)-1; $len--; ) 43 { 44 list($key, $val) = explode('=', $argv[$len]); 45 $arr[$key] = $val; 46 } 47 return $arr; 48 } 49 50 51 //圖片加密函數 52 //路徑文件夾 53 //是否為復制(默認不復制) 54 //鹽(默認為salt) 55 function img_enconde($path, $is_copy = 0, $salt = 'salt') 56 { 57 $time1 = microtime(1); 58 $handle = opendir($path); 59 if(!$salt) $salt = 'salt'; 60 if($handle) 61 { 62 echo "路徑:" . $path . "\r\n\r\n"; 63 //在指定文件夾下創建臨時文件夾 64 $temp_dir = $path . '\\' . 'temp'; 65 @mkdir($temp_dir, 0777, 1); 66 67 while ($file = readdir($handle)) 68 { 69 $time2 = microtime(1); 70 //構造當前文件絕對地址 71 $dir_path = $path . '\\' . $file; 72 //獲取文件後綴 73 $suffix = strrchr($file, '.'); 74 //圖片後綴 75 $fix = array('.jpg', '.gif', '.bmp', '.png', '.jpeg', '.JPG', '.GIF', '.BMP', '.PNG', 'JPEG'); 76 77 if(is_file($dir_path) && in_array($suffix, $fix)) 78 { 79 //打開當前文件 80 $fh = fopen($dir_path, 'r'); 81 82 //打開文件為流 83 $stream = fread($fh, filesize($dir_path)); 84 //輸出 85 file_put_contents($temp_dir . '\\' . uniqid('',1), $file . '!' . $salt . '@' . $stream); 86 //關閉句柄 87 fclose($fh); 88 89 //是否為復制 90 //1為復制,0為刪除(默認) 91 if(!$is_copy) 92 { 93 echo "加密並刪除 : " . $dir_path . "\r\n"; 94 @unlink($dir_path); 95 } 96 else 97 { 98 echo "加密 : " . $dir_path . "\r\n"; 99 } 100 $time3 = microtime(1); 101 echo "此圖用時 ", ($time3 - $time2), " S\r\n", "已經用時 ", ($time3 - $time1), " S\r\n\r\n"; 102 } 103 } 104 105 echo "加密完成\r\n"; 106 } 107 else 108 { 109 echo "path invalid "; 110 return false; 111 } 112 } 113 114 //圖片解密函數 115 //路徑文件夾 116 //是否為復制(默認不復制) 117 //鹽(默認為salt)加密寫什麼,這裡就寫什麼 118 function img_deconde($path, $is_copy = 0, $salt = '') 119 { 120 $time1 = microtime(1); 121 $handle = opendir($path); 122 if($handle) 123 { 124 echo "路徑:" . $path . "\r\n\r\n"; 125 if(!$salt) $salt = 'salt'; 126 127 //在指定文件夾下創建臨時文件夾 128 $temp_dir = $path . '\\' . 'temp'; 129 @mkdir($temp_dir, 0777, 1); 130 131 //核心正則 132 $reg = "#^(.+?[jpgifbmne]{3,4})!(" . $salt . ")@#im"; 133 $res = array(); 134 135 $count = 0; 136 while ($file = readdir($handle)) 137 { 138 $time2 = microtime(1); 139 //構造當前文件絕對地址 140 $file_path = $path . '\\' . $file; 141 142 if(is_file($file_path)) 143 { 144 //文件句柄 145 $hf = fopen($file_path, 'r'); 146 //返回流 147 $stream = fread($hf, filesize($file_path)); 148 fclose($hf); 149 150 //匹配加的密碼 151 if(preg_match_all($reg, $stream, $res)) 152 { 153 $count++; 154 //清空鹽 155 $stream = str_replace($res[0][0], '', $stream); 156 //輸出文件 157 file_put_contents($temp_dir . '\\' . $res[1][0], $stream); 158 159 //是否為復制 160 //1為復制,0為刪除(默認) 161 if(!$is_copy) 162 { 163 echo "成功解密刪除 : " . $temp_dir . '\\' . $res[1][0] . "\r\n"; 164 @unlink($file_path); 165 } 166 else 167 { 168 echo "解密 : " . $temp_dir . '\\' . $res[1][0] . "\r\n"; 169 } 170 } 171 $time3 = microtime(1); 172 echo "此圖用時 ", ($time3 - $time2), " S\r\n", "已經用時 ", ($time3 - $time1), " S\r\n\r\n"; 173 } 174 } 175 if(!$count) 176 { 177 echo "沒有有效的加密文件\r\n"; 178 return false; 179 } 180 echo "解密完成\r\n"; 181 } 182 else 183 { 184 echo "path invalid "; 185 return false; 186 } 187 } 188 189 ?>