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

前端之家收集整理的这篇文章主要介绍了PHP实现支持加盐的图片加密解密前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一个简单的图片加解密函数,使用client跑,不要使用浏览器跑

话不多说,直接上代码

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['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);

  1. while ($file = readdir($handle))
  2. {
  3. $time2 = microtime(1);
  4. //构造当前文件绝对地址
  5. $dir_path = $path . '\\' . $file;
  6. //获取文件后缀
  7. $suffix = strrchr($file,'.');
  8. //图片后缀
  9. $fix = array('.jpg','.gif','.bmp','.png','.jpeg','.JPG','.GIF','.BMP','.PNG','JPEG');
  10. if(is_file($dir_path) && in_array($suffix,$fix))
  11. {
  12. //打开当前文件
  13. $fh = fopen($dir_path,'r');
  14. //打开文件为流
  15. $stream = fread($fh,filesize($dir_path));
  16. //输出
  17. file_put_contents($temp_dir . '\\' . uniqid('',1),$file . '!' . $salt . '@' . $stream);
  18. //关闭句柄
  19. fclose($fh);
  20. //是否为复制
  21. //1为复制,0为删除(默认)
  22. if(!$is_copy)
  23. {
  24. echo "加密并删除 : " . $dir_path . "\r\n";
  25. @unlink($dir_path);
  26. }
  27. else
  28. {
  29. echo "加密 : " . $dir_path . "\r\n";
  30. }
  31. $time3 = microtime(1);
  32. echo "此图用时 ",($time3 - $time2)," S\r\n","已经用时 ",($time3 - $time1)," S\r\n\r\n";
  33. }
  34. }
  35. echo "加密完成\r\n";

}
else
{
echo "path invalid ";
return false;
}
}

//图片解密函数
//路径文件夹
//是否为复制(默认不复制)
//盐(默认为salt)加密写什么,这里就写什么
function img_deconde($path,$salt = '')
{
$time1 = microtime(1);
$handle = opendir($path);
if($handle)
{
echo "路径:" . $path . "\r\n\r\n";
if(!$salt) $salt = 'salt';

  1. //在指定文件夹下创建临时文件夹
  2. $temp_dir = $path . '\\' . 'temp';
  3. @mkdir($temp_dir,1);
  4. //核心正则
  5. $reg = "#^(.+?[jpgifbmne]{3,4})!(" . $salt . ")@#im";
  6. $res = array();
  7. $count = 0;
  8. while ($file = readdir($handle))
  9. {
  10. $time2 = microtime(1);
  11. //构造当前文件绝对地址
  12. $file_path = $path . '\\' . $file;
  13. if(is_file($file_path))
  14. {
  15. //文件句柄
  16. $hf = fopen($file_path,'r');
  17. //返回流
  18. $stream = fread($hf,filesize($file_path));
  19. fclose($hf);
  20. //匹配加的密码
  21. if(preg_match_all($reg,$stream,$res))
  22. {
  23. $count++;
  24. //清空盐
  25. $stream = str_replace($res[0][0],'',$stream);
  26. //输出文件
  27. file_put_contents($temp_dir . '\\' . $res[1][0],$stream);
  28. //是否为复制
  29. //1为复制,0为删除(默认)
  30. if(!$is_copy)
  31. {
  32. echo "成功解密删除 : " . $temp_dir . '\\' . $res[1][0] . "\r\n";
  33. @unlink($file_path);
  34. }
  35. else
  36. {
  37. echo "解密 : " . $temp_dir . '\\' . $res[1][0] . "\r\n";
  38. }
  39. }
  40. $time3 = microtime(1);
  41. echo "此图用时 "," S\r\n\r\n";
  42. }
  43. }
  44. if(!$count)
  45. {
  46. echo "没有有效的加密文件\r\n";
  47. return false;
  48. }
  49. echo "解密完成\r\n";

}
else
{
echo "path invalid ";
return false;
}
}

?>

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

猜你在找的PHP相关文章