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 is_dir() 判断给定文件名是否是一个目录
May 10 PHP
php后退一页表单内容保存实现方法
Jun 17 PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 PHP
php截取html字符串及自动补全html标签的方法
Jan 15 PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
Jan 08 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
php获取微信openid方法总结
Oct 10 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 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实现mysql同步的实现方法
2009/10/21 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
js打造数组转json函数
2015/01/14 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
原生js实现下拉选项卡
2019/11/27 Javascript
Python采用Django开发自己的博客系统
2020/09/29 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
python实现可变变量名方法详解
2019/07/01 Python
python3 mmh3安装及使用方法
2019/10/09 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
历史学专业毕业生求职信
2013/09/27 职场文书
大学生就业推荐信范文
2013/11/29 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
校园广播稿精选
2014/10/01 职场文书
小学教师年度个人总结
2015/02/05 职场文书
初中信息技术教学反思
2016/02/16 职场文书
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android