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 中的类
Oct 09 PHP
利用php来自动调用不同服务器上的flash
Oct 09 PHP
php xml实例 留言本
Mar 20 PHP
PHP 年龄计算函数(精确到天)
Jun 07 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
Apr 15 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
又一个PHP实现的冒泡排序算法分享
Aug 21 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
php学习笔记之面向对象
Nov 08 PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 PHP
解决在laravel中auth建立时候遇到的问题
Oct 15 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合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
javascript Array 数组常用方法
2015/04/05 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
2017/02/02 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
简单实现python聊天程序
2018/04/01 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
python DataFrame 取差集实例
2019/01/30 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
Python字典对象实现原理详解
2019/07/01 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
django正续或者倒序查库实例
2020/05/19 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
急诊科护士自我鉴定
2013/10/14 职场文书
财务经理岗位职责
2013/11/09 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
运动会报道稿300字
2014/10/02 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang