php实现图片加密解密,支持加盐
程序员文章站
2022-05-25 13:18:47
...
一个简单的图片加解密函数
使用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 ?>