标签 php 下的文章

算法概述

  • 加密因子:0xA3
  • 加密算法:将待加密的字符串中的每一个字节,分别与加密因子进行异或,然后将异或后的二进制结果进行高低位交换,然后将交换后的结果转换成2进制字符串。所有的字节转换完成后,将最终的结果base64加密。
  • 解密算法:其实就是加密算法的反向操作。先将加密字符串base64解密,然后字符串的每一个字节(就是上面转的二进制字符串)转换成二进制,再将二进制高低位交换、异或,最后将二进制转换成字符。

具体代码

/**
 * 加密算法
 */
function encrypt($str, $secret)
{
    // 存放结果字符串
    $result = ''; 
    // 加密
    for($i = 0; $i < strlen($str); $i++) {
        // 异或
        $xor = ord($str[$i]) ^ hexdec($secret);
        // 转二进制
        $binary = decbin($xor);
        // 高低位交换
        $reverse = implode('', array_reverse(str_split($binary, 4)));
        // 转换成16进制,如果出现1位的情况,左侧补0
        $encodeData = str_pad(base_convert($reverse, 2, 16), 2, '0', STR_PAD_LEFT);
        // 16进制转二进制字符串
        $result .= pack('H*', $encodeData);
    }
    return base64_encode($result);
}

/**
 * 解密算法
 */
function decrypt($str, $secret)
{
    // 存放结果字符串
    $result = '';
    // 解码base64
    $str = base64_decode($str);
    // 解密
    for($i = 0; $i < strlen($str); $i++) {
        // 二进制字符串转16进制
        $hexadecimal = unpack('H*', $str[$i])[1];
        // 16进制转2进制
        $binary = str_pad(base_convert($hexadecimal, 16, 2), 8, '0', STR_PAD_LEFT);
        // 高低位交换
        $reverse = implode('', array_reverse(str_split($binary, 4)));
        // 异或
        $xor = bindec($reverse) ^ hexdec($secret);
        // 二进制转字符串
        $result .= pack('C', $xor);
    }
    return $result;
}

$result = encrypt('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()_+-=', 'A3');
$result = decrypt($result, 'A3');

一直以来都过度依赖于宝塔面板,很少配置环境了。这次有客户要求必须要用docker来配置服务器环境,于是用docker装了一个ubuntu,在这个ubuntu中安装php和nginx环境。遇到的坑不少,感觉值得记录的,就是这个path_info模式配置了,各种尝试各种不对,最终还是把宝塔的path_info配置复制了过来,生效了,具体配置如下:

location / {
    index index.php index.html index.htm;
    if (!-e $request_filename) {
        rewrite  ^(.*)$  /index.php?s=/$1  last;
        break;
    }   
}

location ~ [^/]\.php(/|$) {
    try_files $uri =404;
        
    # 这是宝塔的配置
    set $real_script_name $fastcgi_script_name;
    if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
        set $real_script_name $1; 
        set $path_info $2; 
    }   
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param PATH_INFO $path_info;                                                                                                                                                    

    include        fastcgi_params;
}