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 相关文章推荐
投票管理程序
Oct 09 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 PHP
PHP中的integer类型使用分析
Jul 27 PHP
PHP防止跨域提交表单
Nov 01 PHP
php引用传值实例详解学习
Nov 06 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
php判断用户是否手机访问代码
Jun 08 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
浅谈Laravel模板实体转义带来的坑
Oct 22 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
新闻分类录入、显示系统
2006/10/09 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
Jquery Ajax.ashx 高效分页实现代码
2009/10/20 Javascript
jquery each()源代码
2011/02/14 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
动态加载js和css(外部文件)
2013/04/17 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Numpy之文件存取的示例代码
2018/08/03 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
存储过程的优点有哪些
2012/09/27 面试题
Unix/Linux开发面试题
2016/08/16 面试题
作风建设整改方案
2014/10/27 职场文书
地震慰问信
2015/02/14 职场文书
博士导师推荐信
2015/03/25 职场文书
行政撤诉申请书
2015/05/18 职场文书
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python