程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP實現支持加鹽的圖片加密解密

PHP實現支持加鹽的圖片加密解密

編輯:PHP綜合

一個簡單的圖片加解密函數,使用client跑,不要使用浏覽器跑

話不多說,直接上代碼

<?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;
  }
}

?>

以上就是這篇文章的全部內容,希望對大家的學習或者工作能有一定的幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved