首页  >  文章  >  类库下载  >  php实现图片加密解密,支持加盐

php实现图片加密解密,支持加盐

高洛峰
高洛峰原创
2016-10-10 11:08:531294浏览

一个简单的图片加解密函数

使用client跑,不要使用浏览器跑

1.jpg

1.jpg

1.png

<?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 != &#39;cli&#39;) {echo $notice;die;}

//获取参数
$arr = parse_parameter($argv);

//如果路径没设置
if(!isset($arr[&#39;path&#39;]) || !isset($arr[&#39;type&#39;]))     {echo $notice;die;}
//如果is_dir没设置
if(!isset($arr[&#39;is_copy&#39;]))                         {$arr[&#39;is_copy&#39;] = &#39;&#39;;}
//如果salt没设置
if(!isset($arr[&#39;salt&#39;]))                             {$arr[&#39;salt&#39;] = &#39;&#39;;}

//type为en就加密
if($arr[&#39;type&#39;] == "en") img_enconde($arr[&#39;path&#39;], $arr[&#39;is_copy&#39;], $arr[&#39;salt&#39;]);
//type为de就解密
if($arr[&#39;type&#39;] == "de") img_deconde($arr[&#39;path&#39;], $arr[&#39;is_copy&#39;], $arr[&#39;salt&#39;]);


function parse_parameter($argv)
{
    $arr = array();
    //获取参数
    for($len=count($argv)-1; $len--; )
    {
        list($key, $val) = explode(&#39;=&#39;, $argv[$len]);
        $arr[$key] = $val;
    }
    return $arr;
}


//图片加密函数
//路径文件夹
//是否为复制(默认不复制)
//盐(默认为salt)
function img_enconde($path, $is_copy = 0, $salt = &#39;salt&#39;)
{
    $time1 = microtime(1);
    $handle = opendir($path);
    if(!$salt) $salt = &#39;salt&#39;;
    if($handle)
    {
        echo "路径:" . $path . "\r\n\r\n";
        //在指定文件夹下创建临时文件夹
        $temp_dir = $path . &#39;\\&#39; . &#39;temp&#39;;
        @mkdir($temp_dir, 0777, 1);

        while ($file = readdir($handle))
        {
            $time2 = microtime(1);
            //构造当前文件绝对地址
            $dir_path = $path . &#39;\\&#39; . $file;
            //获取文件后缀
            $suffix = strrchr($file, &#39;.&#39;);
            //图片后缀
            $fix = array(&#39;.jpg&#39;, &#39;.gif&#39;, &#39;.bmp&#39;, &#39;.png&#39;, &#39;.jpeg&#39;, &#39;.JPG&#39;, &#39;.GIF&#39;, &#39;.BMP&#39;, &#39;.PNG&#39;, &#39;JPEG&#39;);

            if(is_file($dir_path) && in_array($suffix, $fix))
            {
                //打开当前文件
                $fh = fopen($dir_path, &#39;r&#39;);

                //打开文件为流
                $stream = fread($fh, filesize($dir_path));
                //输出
                file_put_contents($temp_dir . &#39;\\&#39; . uniqid(&#39;&#39;,1), $file . &#39;!&#39; . $salt . &#39;@&#39; . $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 = &#39;&#39;)
{
    $time1 = microtime(1);
    $handle = opendir($path);
    if($handle)
    {
        echo "路径:" . $path . "\r\n\r\n";
        if(!$salt) $salt = &#39;salt&#39;;

        //在指定文件夹下创建临时文件夹
        $temp_dir = $path . &#39;\\&#39; . &#39;temp&#39;;
        @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 . &#39;\\&#39; . $file;

            if(is_file($file_path))
            {
                //文件句柄
                $hf = fopen($file_path, &#39;r&#39;);
                //返回流
                $stream = fread($hf, filesize($file_path));
                fclose($hf);

                //匹配加的密码
                if(preg_match_all($reg, $stream, $res))
                {
                    $count++;
                    //清空盐
                    $stream = str_replace($res[0][0], &#39;&#39;, $stream);
                    //输出文件
                    file_put_contents($temp_dir . &#39;\\&#39; . $res[1][0], $stream);

                    //是否为复制
                    //1为复制,0为删除(默认)
                    if(!$is_copy)
                    {
                        echo "成功解密删除 : " . $temp_dir . &#39;\\&#39; . $res[1][0] . "\r\n";
                        @unlink($file_path);
                    }
                    else
                    {
                        echo "解密 : " . $temp_dir . &#39;\\&#39; . $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;
    }
}

?>


声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关文章

查看更多