一組輕量級的 PHP 可逆加密解密函數,結合 Base64、動態亂數鍵值、XOR 位運算與固定金鑰二次混淆,適用於非極高安全需求的參數傳遞、Token 生成、URL 簽名等場景。
<?php
/**
* 加密函數
* @param string $str 明文
* @param string $key 密鑰
* @return string 密文
*/
function passport_encrypt($str, $key) {
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000)); // 動態亂數鍵
$ctr = 0;
$tmp = '';
for ($i = 0; $i < strlen($str); $i++) {
$ctr = ($ctr == strlen($encrypt_key)) ? 0 : $ctr;
$tmp .= $encrypt_key[$ctr] . ($str[$i] ^ $encrypt_key[$ctr++]);
}
return base64_encode(passport_key($tmp, $key));
}
/**
* 解密函數
* @param string $str 密文
* @param string $key 密鑰
* @return string 明文
*/
function passport_decrypt($str, $key) {
$str = passport_key(base64_decode($str), $key);
$tmp = '';
for ($i = 0; $i < strlen($str); $i++) {
$md5 = $str[$i];
$tmp .= $str[++$i] ^ $md5;
}
return $tmp;
}
/**
* 輔助函數:固定金鑰二次 XOR
*/
function passport_key($str, $encrypt_key) {
$encrypt_key = md5($encrypt_key);
$ctr = 0;
$tmp = '';
for ($i = 0; $i < strlen($str); $i++) {
$ctr = ($ctr == strlen($encrypt_key)) ? 0 : $ctr;
$tmp .= $str[$i] ^ $encrypt_key[$ctr++];
}
return $tmp;
}
// 測試
$str = '作者:WWW.JB51.NET';
$key = 'jb51net';
$encrypt = passport_encrypt($str, $key);
$decrypt = passport_decrypt($encrypt, $key);
echo '原文:', $str, "<br><hr>";
echo '密文:', $encrypt, "<br><hr>";
echo '譯文:', $decrypt, "<br><hr>";
?>
$encrypt_key;XOR,並將動態鍵字元插入結果中(交織);passport_key() 用固定金鑰 md5($key) 二次 XOR;base64_encode 輸出可列印字串。| 特性 | 說明 |
|---|---|
| 可逆性 | 對稱加密,同金鑰可解密 |
| 密文長度 | 約明文 2~3 倍(含交織鍵 + Base64) |
| 抗暴力破解 | 低(動態鍵空間小、XOR 線性、無完整性驗證) |
| 效能 | 極快,純 PHP 迴圈,適合高頻調用 |
| 適用場景 | 內部參數混淆、短時效 Token、非敏感資料傳遞 |
openssl_encrypt (AES-256-GCM) 或 sodium (libsodium);srand((double)microtime() * 1000000) 在 PHP 4.2+ 已自動播種,可移除。// 推薦:AES-256-GCM (PHP 7.1+)
function encrypt_modern($data, $key) {
$iv = random_bytes(12);
$ct = openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
return base64_encode($iv . $tag . $ct);
}
function decrypt_modern($payload, $key) {
$raw = base64_decode($payload);
$iv = substr($raw, 0, 12);
$tag = substr($raw, 12, 16);
$ct = substr($raw, 28);
return openssl_decrypt($ct, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
}
經典演算法適合學習加密原理,生產環境請優先採用經過密碼學驗證的現代庫。