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

5年以前  |  阅读数:866 次  |  编程语言:PHP 

一个简单的图片加解密函数,使用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    -- 加密钥匙 加密用什么,解密就用什么  不写默认为salt
    A;

    //如果不是客户端
    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;
      }
    }

    ?>

以上就是这篇文章的全部内容,希望对大家的学习或者工作能有一定的帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例