静态站点希望能随机生成url,不希望用规律的方式,同时也不希望url规则被逆,那么可以自定义以下对称算法来生成url路径是个不错的选择.

import hashlib
from Crypto.Cipher import AES
import base64

# PKCS7填充:根据块大小对数据进行填充
def pkcs7_pad(data, block_size):
    padding_size = block_size - len(data) % block_size
    padding = bytes([padding_size]) * padding_size
    return data + padding

# 反向PKCS7填充:去除填充数据
def pkcs7_unpad(data):
    padding_size = data[-1]
    if padding_size > len(data):
        raise ValueError("Invalid padding")
    return data[:-padding_size]

# 创建路径加密函数
def creat_path_encrypt(data, key):
    # 使用MD5算法对密钥进行哈希处理
    key = hashlib.md5(key.encode()).digest()
    
    # 创建AES加密器对象,使用ECB模式
    cipher = AES.new(key, AES.MODE_ECB)
    
    # 将输入数据编码为UTF-8,并进行PKCS7填充
    data = data.encode('utf-8')
    padded_data = pkcs7_pad(data, AES.block_size)
    
    # 使用AES加密器进行加密,并对加密后的数据进行Base64编码(URL安全)
    encrypted = cipher.encrypt(padded_data)
    result = base64.urlsafe_b64encode(encrypted).rstrip(b'=').decode()
    return result

# 创建路径解密函数
def creat_path_decrypt(data, key):
    # 使用MD5算法对密钥进行哈希处理
    key = hashlib.md5(key.encode()).digest()
    
    # 创建AES解密器对象,使用ECB模式
    cipher = AES.new(key, AES.MODE_ECB)
    
    # 替换Base64编码中的URL安全字符,并进行Base64解码
    data = base64.urlsafe_b64decode(data + '=' * (4 - len(data) % 4))
    
    # 使用AES解密器进行解密,然后反向PKCS7填充
    decrypted = cipher.decrypt(data)
    unpadded_data = pkcs7_unpad(decrypted)
    
    # 将解密后的数据转换为UTF-8编码
    result = unpadded_data.decode('utf-8')
    return result

# 示例数据和密钥
data = '🦜红嘴黑毛是什么鸟\\"? /�~"3^2_白头黑鹎是吉祥鸟?'
key = '5u�.\\"com.cn🚀'

# 加密数据并打印结果
ret = creat_path_encrypt(data, key)
print("加密结果:", ret)

# 解密数据并打印结果
print("解密结果:", creat_path_decrypt(ret, key))

<?php
// 定义加密函数
function creat_path_encrypt($data, $key) {
    // 使用MD5算法对密钥进行哈希处理
    $key = md5($key, true);
    // 使用OpenSSL进行AES-128-ECB模式加密
    $encrypted = openssl_encrypt($data, 'aes-128-ecb', $key, OPENSSL_RAW_DATA);
    // 对加密后的数据进行Base64编码,并替换特殊字符
    $result = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($encrypted));
    return $result;
}

// 定义解密函数
function creat_path_decrypt($data, $key) {
    // 使用MD5算法对密钥进行哈希处理
    $key = md5($key, true);
    // 替换特殊字符并进行Base64解码
    $data = str_replace(['-', '_'], ['+', '/'], $data);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    $data = base64_decode($data);
    // 使用OpenSSL进行AES-128-ECB模式解密
    $decrypted = openssl_decrypt($data, 'aes-128-ecb', $key, OPENSSL_RAW_DATA);
    return $decrypted;
}

// 示例数据和密钥
$data = '🦜红嘴黑毛是什么鸟\\"? /�~"3^2_白头黑鹎是吉祥鸟?';
$key = '5u�.\\"com.cn🚀';

// 加密数据并打印结果
$ret = creat_path_encrypt($data, $key);
echo "加密结果: " . $ret . "\n";

// 解密数据并打印结果
echo "解密结果: " . creat_path_decrypt($ret, $key);
?>

  • 可以看到加解密的结果是一致的.
  • data 是待加密的字符串.
  • key 相当于是你的密钥.
  • 在两个参数中,我分别使用了乱码,emoji表情,符号,转义符.
  • 注意:如果需要使用转义符,必须要\\这样写.

加密结果: Vf0XRSHf55XHpVaIU_zi0ogrYcAqFyxS7o5BC1EP4ZE0thqkShjjq-2WcP_A9cu08szz7B65UxfCaaZl4S0SA617kUcRKZMyK5D8Dfo9YcY
解密结果: 🦜红嘴黑毛是什么鸟\"? /�~"3^2_白头黑鹎是吉祥鸟?
最后修改:2023 年 08 月 05 日
如果觉得我的文章对你有用,请随意赞赏