一個簡單的圖片加解密函數
使用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 ?>