静态站点希望能随机生成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_白头黑鹎是吉祥鸟?