PHP 文件加密、解密

    PHP文件加密、解密

/**
 * 加密字符串算法
 *
 * @param [type] $data 需要加密的字符串
 * @param string $key 盐值
 * @return void
 */
function scarecrowEncryptStr($data, $key="")  
{  
    $char   =   "";
    $str    =   "";
    $key    =   md5($key);  
    $data   =   $key . 'scarecrow' . $data . $key . 'scarecrow';
    $x      =   0;  
    $len    =   strlen($data);  
    $l      =   strlen($key);  
    for ($i = 0; $i < $len; $i++)  
    {  
        if ($x == $l)   
        {  
            $x = 0;  
        }  
        $char .= $key{$x};  
        $x++;  
    }  
    for ($i = 0; $i < $len; $i++)  
    {       
        $str .= chr((ord($data{$i}) + ord($char{$i})) % 256);  
    }  

    $relStr = unpack("H*",base64_encode($str))[1] ?? "";
    if ($relStr) {
        return gzcompress($relStr, 9);
    }  
    return false;
} 

/**
 * 解密字符串算法
 *
 * @param [type] $data 需要解密的字符串
 * @param string $key 盐值
 * @return void
 */
function scarecrowDecryptStr($data, $key="") 
{  
    $char= "";
    $str="";
    $key = md5($key);  
    $x = 0;  
    $data = base64_decode(pack("H*", preg_replace("/[^\d|a-z|A-Z]+/u",'',gzuncompress($data))));
    $len = strlen($data);  
    $l = strlen($key);  
    for ($i = 0; $i < $len; $i++)  
    {  
        if ($x == $l)   
        {  
            $x = 0;  
        }  
        $char .= substr($key, $x, 1);  
        $x++;  
    }  
    for ($i = 0; $i < $len; $i++)  
    {  
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))  
        {  
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));  
        }  
        else  
        {  
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));  
        }  
    }  
    return substr($str, 41, strlen($str) - 82);
}

function encodeFile(string $srcFilePath, string $outFilePath="", string $key="", $fileMaxSize=500) {
    $srcFilePath = realpath($srcFilePath);
    if (!file_exists($srcFilePath)) {
        return [
            'code'  =>  1,
            'msg'   =>  '被加密文件不存在'
        ];
    }
    
    $outFilePath = preg_replace('/[\/|\\\]+/u','/',$outFilePath);
    $outBasePath = substr($outFilePath, 0,  strrpos($outFilePath, '/') + 1);
    
    if (!is_dir($outBasePath)) {
        @mkdir($outBasePath, 0666, true);
    }
    
    if (!is_dir($outBasePath)) {
        return [
            'code'  =>  2,
            'msg'   =>  '输出路径不存在'
        ];
    }
    
    $fileSize = filesize($srcFilePath);
    if ($fileSize > $fileMaxSize * 1024 * 1024) {
        return [
            'code'  =>  3,
            'msg'   =>  '文件超过最大文件大小'
        ];
    }
    $key = md5($key);
    $fileContent = file_get_contents($srcFilePath);
    $content = scarecrowEncryptStr($fileContent, $key);
    if ($content === false) {
        return [
            'code'  =>  4,
            'msg'   =>  '加密失败'
        ];
    }
    if (file_exists($outFilePath)) {
        @unlink($outFilePath);
    }
    file_put_contents($outFilePath, $content);
    return [
        'code'  =>  0,
        'msg'   =>  '加密成功'
    ];
}

function decryptFile(string $srcFilePath, string $key="", string $outFilePath="", $isSave=false) {
    $srcFilePath = realpath($srcFilePath);
    if (!file_exists($srcFilePath)) {
        return [
            'code'  =>  1,
            'msg'   =>  '解密文件不存在'
        ];
    }
    
    $data = scarecrowDecryptStr(file_get_contents($srcFilePath), md5($key));
    if ($isSave) {
        $outFilePath = preg_replace('/[\/|\\\]+/u','/',$outFilePath);
        $outBasePath = substr($outFilePath, 0,  strrpos($outFilePath, '/') + 1);
        
        if (!is_dir($outBasePath)) {
            @mkdir($outBasePath, 0666, true);
        }
        
        if (!is_dir($outBasePath)) {
            return [
                'code'  =>  2,
                'msg'   =>  '输出路径不存在'
            ];
        }
        file_put_contents($outFilePath, $data);
        return [
            'code'  =>  0,
            'msg'   =>  '解密成功',
            'data'  =>  ''
        ];
    } else {
        return [
            'code'  =>  0,
            'msg'   =>  '解密成功',
            'data'  =>  $data
        ];
    }
}

$str = encodeFile("./3.jpg", "./pqs/test//3.back.jpg","LOVE");
var_dump($str);
$str = decryptFile("./pqs/test//3.back.jpg","LOVE","./img/3.test.jpg", true);
var_dump($str);


该算法用于加密文件、解密文件可以设置盐值,输出为二进制内容文件

阅读数:169
如有疑问请与我联系:点击与我联系