求一个PHP简单的加解密函数,加密后长度比较短,不区分大小写?

新手上路,请多包涵

用途:主要用于URL的参数加密!

比如动态URL:xx.com/index.php?cid=1&id=2.html
实现成:xx.com/index.php?pwd=A1B2c3.html

把 cid=1&id=2 进行加密!

要求:
1、加密后的长度尽量短,openssl_decrypt 这个加密后的太长了!
2、加密后的密文要求不区分大小写, A1B2c3和 a1b2c3 都可以,也就是URL的大小写都可以访问。

阅读 2.5k
2 个回答

不必要加密,可以考虑直接存数据库。如果数据量不大,直接存文件也行。


还可以考虑使用 PHP 实现的 hashids,注意,仅限数字。

可以自定义传入定制的字符串编码和长度,并且构造函数的第三个参数就可以传入编码后使用的字符串。

你这里希望不区分大小写,那就去掉大写。生成后随机把其中的字符转换为大写,使用时再统一转为小写再解析就可以了。

function xor_encrypt($data, $key) {
    $key_len = strlen($key);
    $data_len = strlen($data);
    $output = '';

    for ($i = 0; $i < $data_len; ++$i) {
        $output .= $data[$i] ^ $key[$i % $key_len];
    }

    return bin2hex($output);
}

function xor_decrypt($data, $key) {
    $key_len = strlen($key);
    $data = hex2bin($data);
    $data_len = strlen($data);
    $output = '';

    for ($i = 0; $i < $data_len; ++$i) {
        $output .= $data[$i] ^ $key[$i % $key_len];
    }

    return $output;
}

function generate_encrypted_url($base_url, $params, $key) {
    $param_str = http_build_query($params);
    $encrypted = xor_encrypt($param_str, $key);
    return $base_url . '?pwd=' . strtolower($encrypted);
}

function parse_encrypted_url($url, $key) {
    $url_parts = parse_url($url);
    parse_str($url_parts['query'], $query_params);
    $encrypted = $query_params['pwd'];
    $decrypted = xor_decrypt(strtolower($encrypted), $key);
    parse_str($decrypted, $original_params);
    return $original_params;
}

$key = 'your_key';
$params = array('cid' => 1, 'id' => 2);
$base_url = 'xx.com/index.php';
$encrypted_url = generate_encrypted_url($base_url, $params, $key);

echo "Encrypted URL: " . $encrypted_url . "\n";

$parsed_params = parse_encrypted_url($encrypted_url, $key);
echo "Decrypted params: ";
print_r($parsed_params);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题