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下MAIL的另一解决方案
Oct 09 PHP
同一空间绑定多个域名而实现访问不同页面的PHP代码
Dec 06 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
php笔记之:数据类型与常量的使用分析
May 14 PHP
php实现的漂亮分页方法
Apr 17 PHP
PHP计算指定日期所在周的开始和结束日期的方法
Mar 24 PHP
Yii多表联合查询操作详解
Jun 02 PHP
php微信高级接口群发 多客服
Jun 23 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP implode()函数用法讲解
Mar 08 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 strtotime函数详解
2009/12/18 PHP
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
php的4种常见运行方式
2015/03/20 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
简单介绍Python中的JSON模块
2015/04/08 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
Python实现的旋转数组功能算法示例
2019/02/23 Python
Python列表list操作相关知识小结
2020/01/29 Python
给同事的道歉信
2014/01/11 职场文书
话题作文之呼唤
2019/12/18 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers