php教程

超轻量级php框架startmvc

PHP实现支持加盐的图片加密解密

更新时间:2020-03-11 14:44:23 作者:startmvc
一个简单的图片加解密函数,使用client跑,不要使用浏览器跑话不多说,直接上代码<?

一个简单的图片加解密函数,使用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;
 }
}

?>

以上就是这篇文章的全部内容,希望对大家的学习或者工作能有一定的帮助。

php 加密解密函数 php 加密解密 md5加盐 加密解密