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中的串行化变量和序列化对象
Sep 05 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
PHP文件上传原理简单分析
May 29 PHP
PHP中几种常见的超时处理全面总结
Sep 11 PHP
php mail to 配置详解
Jan 16 PHP
php实现的通用图片处理类
Mar 24 PHP
php.ini中的request_order推荐设置
May 10 PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
PHP中的print_r 与 var_dump 输出数组
Jun 13 PHP
PHP与服务器文件系统的简单交互
Oct 21 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 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
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
PHP memcache扩展的三种安装方法
2009/04/26 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
Python上下文管理器全实例详解
2019/11/12 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
匡威帆布鞋美国官网:Converse美国
2016/08/22 全球购物
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
广告学专业推荐信范文
2013/11/23 职场文书
公司委托书范本
2014/04/04 职场文书
七一党日活动总结
2014/07/08 职场文书
竞选班长演讲稿500字
2014/08/22 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
好员工观后感
2015/06/17 职场文书
七年级数学教学反思
2016/02/17 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS