首页 > 开发 > PHP > 正文

PHP实现支持加盐的图片加密解密

2024-05-04 22:52:52
字体:
来源:转载
供稿:网友

一个简单的图片加解密函数,使用client跑,不要使用浏览器跑

话不多说,直接上代码

<?php/** * Created by hello. * User: qq 845875470 * Date: 2016/4/2 * Time: 11:21 */$notice = <<<A  为了稳定性,必须在客户端跑  格式 :php path=D:/xxx/uuu type=en is_copy=1 salt=xxx  参数使用空格分开  path    -- 路径 必须写  type    -- en加密, de为解密 必须写  is_copy    -- 1为复制,0为转移,         不写默认为转移  salt    -- 加密钥匙 加密用什么,解密就用什么  不写默认为saltA;//如果不是客户端if(PHP_SAPI != 'cli') {echo $notice;die;}//获取参数$arr = parse_parameter($argv);//如果路径没设置if(!isset($arr['path']) || !isset($arr['type']))   {echo $notice;die;}//如果is_dir没设置if(!isset($arr['is_copy']))             {$arr['is_copy'] = '';}//如果salt没设置if(!isset($arr['salt']))               {$arr['salt'] = '';}//type为en就加密if($arr['type'] == "en") img_enconde($arr['path'], $arr['is_copy'], $arr['salt']);//type为de就解密if($arr['type'] == "de") img_deconde($arr['path'], $arr['is_copy'], $arr['salt']);function parse_parameter($argv){  $arr = array();  //获取参数  for($len=count($argv)-1; $len--; )  {    list($key, $val) = explode('=', $argv[$len]);    $arr[$key] = $val;  }  return $arr;}//图片加密函数//路径文件夹//是否为复制(默认不复制)//盐(默认为salt)function img_enconde($path, $is_copy = 0, $salt = 'salt'){  $time1 = microtime(1);  $handle = opendir($path);  if(!$salt) $salt = 'salt';  if($handle)  {    echo "路径:" . $path . "/r/n/r/n";    //在指定文件夹下创建临时文件夹    $temp_dir = $path . '//' . 'temp';    @mkdir($temp_dir, 0777, 1);    while ($file = readdir($handle))    {      $time2 = microtime(1);      //构造当前文件绝对地址      $dir_path = $path . '//' . $file;      //获取文件后缀      $suffix = strrchr($file, '.');      //图片后缀      $fix = array('.jpg', '.gif', '.bmp', '.png', '.jpeg', '.JPG', '.GIF', '.BMP', '.PNG', 'JPEG');      if(is_file($dir_path) && in_array($suffix, $fix))      {        //打开当前文件        $fh = fopen($dir_path, 'r');        //打开文件为流        $stream = fread($fh, filesize($dir_path));        //输出        file_put_contents($temp_dir . '//' . uniqid('',1), $file . '!' . $salt . '@' . $stream);        //关闭句柄        fclose($fh);        //是否为复制        //1为复制,0为删除(默认)        if(!$is_copy)        {          echo "加密并删除 : " . $dir_path . "/r/n";          @unlink($dir_path);        }        else        {          echo "加密 : " . $dir_path . "/r/n";        }        $time3 = microtime(1);        echo "此图用时 ", ($time3 - $time2), " S/r/n", "已经用时 ", ($time3 - $time1), " S/r/n/r/n";      }    }    echo "加密完成/r/n";  }  else  {    echo "path invalid ";    return false;  }}//图片解密函数//路径文件夹//是否为复制(默认不复制)//盐(默认为salt)加密写什么,这里就写什么function img_deconde($path, $is_copy = 0, $salt = ''){  $time1 = microtime(1);  $handle = opendir($path);  if($handle)  {    echo "路径:" . $path . "/r/n/r/n";    if(!$salt) $salt = 'salt';    //在指定文件夹下创建临时文件夹    $temp_dir = $path . '//' . 'temp';    @mkdir($temp_dir, 0777, 1);    //核心正则    $reg = "#^(.+?[jpgifbmne]{3,4})!(" . $salt . ")@#im";    $res = array();    $count = 0;    while ($file = readdir($handle))    {      $time2 = microtime(1);      //构造当前文件绝对地址      $file_path = $path . '//' . $file;      if(is_file($file_path))      {        //文件句柄        $hf = fopen($file_path, 'r');        //返回流        $stream = fread($hf, filesize($file_path));        fclose($hf);        //匹配加的密码        if(preg_match_all($reg, $stream, $res))        {          $count++;          //清空盐          $stream = str_replace($res[0][0], '', $stream);          //输出文件          file_put_contents($temp_dir . '//' . $res[1][0], $stream);          //是否为复制          //1为复制,0为删除(默认)          if(!$is_copy)          {            echo "成功解密删除 : " . $temp_dir . '//' . $res[1][0] . "/r/n";            @unlink($file_path);          }          else          {            echo "解密 : " . $temp_dir . '//' . $res[1][0] . "/r/n";          }        }        $time3 = microtime(1);        echo "此图用时 ", ($time3 - $time2), " S/r/n", "已经用时 ", ($time3 - $time1), " S/r/n/r/n";      }    }    if(!$count)    {      echo "没有有效的加密文件/r/n";      return false;    }    echo "解密完成/r/n";  }  else  {    echo "path invalid ";    return false;  }}?>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表