>首页  >PHP开发  >查看内容

php实现图片加密解密,支持加盐

2016/10/12 15:12:47|发布者: 艾悠乐|查看: 1144|评论:0

一个简单的图片加解密函数

使用client跑,不要使用浏览器跑


001 //如果不是客户端
002  20 if(PHP_SAPI != 'cli') {echo $notice;die;}
003  21
004  22 //获取参数
005  23 $arr = parse_parameter($argv);
006  24
007  25 //如果路径没设置
008  26 if(!isset($arr['path']) || !isset($arr['type']))     {echo $notice;die;}
009  27 //如果is_dir没设置
010  28 if(!isset($arr['is_copy']))                         {$arr['is_copy'] = '';}
011  29 //如果salt没设置
012  30 if(!isset($arr['salt']))                             {$arr['salt'] = '';}
013  31
014  32 //type为en就加密
015  33 if($arr['type'] == "en") img_enconde($arr['path'], $arr['is_copy'], $arr['salt']);
016  34 //type为de就解密
017  35 if($arr['type'] == "de") img_deconde($arr['path'], $arr['is_copy'], $arr['salt']);
018  36
019  37
020  38 function parse_parameter($argv)
021  39 {
022  40     $arr = array();
023  41     //获取参数
024  42     for($len=count($argv)-1; $len--; )
025  43     {
026  44         list($key, $val) = explode('=', $argv[$len]);
027  45         $arr[$key] = $val;
028  46     }
029  47     return $arr;
030  48 }
031  49
032  50
033  51 //图片加密函数
034  52 //路径文件夹
035  53 //是否为复制(默认不复制)
036  54 //盐(默认为salt)
037  55 function img_enconde($path, $is_copy = 0, $salt = 'salt')
038  56 {
039  57     $time1 = microtime(1);
040  58     $handle = opendir($path);
041  59     if(!$salt) $salt = 'salt';
042  60     if($handle)
043  61     {
044  62         echo "路径:" . $path . "\r\n\r\n";
045  63         //在指定文件夹下创建临时文件夹
046  64         $temp_dir = $path . '\\' . 'temp';
047  65         @mkdir($temp_dir, 0777, 1);
048  66
049  67         while ($file = readdir($handle))
050  68         {
051  69             $time2 = microtime(1);
052  70             //构造当前文件绝对地址
053  71             $dir_path = $path . '\\' . $file;
054  72             //获取文件后缀
055  73             $suffix = strrchr($file, '.');
056  74             //图片后缀
057  75             $fix = array('.jpg', '.gif', '.bmp', '.png', '.jpeg', '.JPG', '.GIF', '.BMP', '.PNG', 'JPEG');
058  76
059  77             if(is_file($dir_path) && in_array($suffix, $fix))
060  78             {
061  79                 //打开当前文件
062  80                 $fh = fopen($dir_path, 'r');
063  81
064  82                 //打开文件为流
065  83                 $stream = fread($fh, filesize($dir_path));
066  84                 //输出
067  85                 file_put_contents($temp_dir . '\\' . uniqid('',1), $file . '!' . $salt . '@' . $stream);
068  86                 //关闭句柄
069  87                 fclose($fh);
070  88
071  89                 //是否为复制
072  90                 //1为复制,0为删除(默认)
073  91                 if(!$is_copy)
074  92                 {
075  93                     echo "加密并删除 : " . $dir_path . "\r\n";
076  94                     @unlink($dir_path);
077  95                 }
078  96                 else
079  97                 {
080  98                     echo "加密 : " . $dir_path . "\r\n";
081  99                 }
082 100                 $time3 = microtime(1);
083 101                 echo "此图用时 ", ($time3 - $time2), " S\r\n", "已经用时 ", ($time3 - $time1), " S\r\n\r\n";
084 102             }
085 103         }
086 104
087 105         echo "加密完成\r\n";
088 106     }
089 107     else
090 108     {
091 109         echo "path invalid ";
092 110         return false;
093 111     }
094 112 }
095 113
096 114 //图片解密函数
097 115 //路径文件夹
098 116 //是否为复制(默认不复制)
099 117 //盐(默认为salt)加密写什么,这里就写什么
100 118 function img_deconde($path, $is_copy = 0, $salt = '')
101 119 {
102 120     $time1 = microtime(1);
103 121     $handle = opendir($path);
104 122     if($handle)
105 123     {
106 124         echo "路径:" . $path . "\r\n\r\n";
107 125         if(!$salt) $salt = 'salt';
108 126
109 127         //在指定文件夹下创建临时文件夹
110 128         $temp_dir = $path . '\\' . 'temp';
111 129         @mkdir($temp_dir, 0777, 1);
112 130
113 131         //核心正则
114 132         $reg = "#^(.+?[jpgifbmne]{3,4})!(" . $salt . ")@#im";
115 133         $res = array();
116 134
117 135         $count = 0;
118 136         while ($file = readdir($handle))
119 137         {
120 138             $time2 = microtime(1);
121 139             //构造当前文件绝对地址
122 140             $file_path = $path . '\\' . $file;
123 141
124 142             if(is_file($file_path))
125 143             {
126 144                 //文件句柄
127 145                 $hf = fopen($file_path, 'r');
128 146                 //返回流
129 147                 $stream = fread($hf, filesize($file_path));
130 148                 fclose($hf);
131 149
132 150                 //匹配加的密码
133 151                 if(preg_match_all($reg, $stream, $res))
134 152                 {
135 153                     $count++;
136 154                     //清空盐
137 155                     $stream = str_replace($res[0][0], '', $stream);
138 156                     //输出文件
139 157                     file_put_contents($temp_dir . '\\' . $res[1][0], $stream);
140 158
141 159                     //是否为复制
142 160                     //1为复制,0为删除(默认)
143 161                     if(!$is_copy)
144 162                     {
145 163                         echo "成功解密删除 : " . $temp_dir . '\\' . $res[1][0] . "\r\n";
146 164                         @unlink($file_path);
147 165                     }
148 166                     else
149 167                     {
150 168                         echo "解密 : " . $temp_dir . '\\' . $res[1][0] . "\r\n";
151 169                     }
152 170                 }
153 171                 $time3 = microtime(1);
154 172                 echo "此图用时 ", ($time3 - $time2), " S\r\n", "已经用时 ", ($time3 - $time1), " S\r\n\r\n";
155 173             }
156 174         }
157 175         if(!$count)
158 176         {
159 177             echo "没有有效的加密文件\r\n";
160 178             return false;
161 179         }
162 180         echo "解密完成\r\n";
163 181     }
164 182     else
165 183     {
166 184         echo "path invalid ";
167 185         return false;
168 186     }
169 187 }
170 188

最新评论

热门资讯

排行榜