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
Dec 14 PHP
隐藏你的.php文件的实现方法
Mar 19 PHP
在同一窗体中使用PHP来处理多个提交任务
May 08 PHP
PHP 缓存实现代码及详细注释
May 16 PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 PHP
用php解析html的实现代码
Aug 08 PHP
Smarty foreach控制循环次数的实现详解
Jul 03 PHP
10个超级有用的PHP代码片段果断收藏
Sep 23 PHP
学习PHP Cookie处理函数
Aug 09 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
Oct 26 PHP
php闭包中使用use声明变量的作用域实例分析
Aug 09 PHP
php获取微信openid方法总结
Oct 10 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中explode与split的区别介绍
2012/10/03 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
vue 自定义右键样式的实例代码
2019/11/06 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
python在文本开头插入一行的实例
2018/05/02 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
浅析Python 责任链设计模式
2020/09/11 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
自我反省检讨书
2014/01/23 职场文书
2014迎新年晚会策划方案
2014/02/23 职场文书
作文评语集锦大全
2014/04/23 职场文书
工作证明英文模板
2014/10/21 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
2014年党总支工作总结
2014/12/18 职场文书
办公室日常管理制度
2015/08/04 职场文书
《学会看病》教学反思
2016/02/17 职场文书