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


Posted in PHP onSeptember 09, 2016

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

话不多说,直接上代码

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

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

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

<?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 相关文章推荐
用php+mysql一个名片库程序
Oct 09 PHP
PHP在字符串中查找指定字符串并删除的代码
Oct 02 PHP
PHP5中虚函数的实现方法分享
Apr 20 PHP
PHP反射机制用法实例
Aug 28 PHP
php递归json类实例
Dec 02 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
PHP长网址与短网址的实现方法
Oct 13 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP-FPM和Nginx的通信机制详解
Feb 01 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
Oct 21 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 #PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 #PHP
PHP实现的网站目录扫描索引工具
Sep 08 #PHP
php操作xml并将其插入数据库的实现方法
Sep 08 #PHP
php添加数据到xml文件的简单例子
Sep 08 #PHP
Yii2中事务的使用实例代码详解
Sep 07 #PHP
PHP模糊查询的实现方法(推荐)
Sep 06 #PHP
You might like
PHP伪静态页面函数附使用方法
2008/06/20 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
全站最详细的Vuex教程
2018/04/13 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
使用python绘制人人网好友关系图示例
2014/04/01 Python
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
Django原生sql也能使用Paginator分页的示例代码
2017/11/15 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
详解anaconda安装步骤
2020/11/23 Python
电气工程和自动化自荐信范文
2013/12/25 职场文书
校运会广播稿100字
2014/01/27 职场文书
期中考试后的反思
2014/02/08 职场文书
行政副总岗位职责
2014/02/23 职场文书
求职简历自我评价2015
2015/03/10 职场文书
毕业酒会致辞
2015/07/29 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB