分享一組自訂的 PHP 加密/解密函式,採用動態金鑰與 XOR 運算結合 Base64 編碼,適合輕量級資料保護(如 API 參數傳遞、Token 生成等)。注意:此為對稱加密,不適合儲存密碼等高敏感資料,密碼請使用 password_hash() / password_verify()。
<?php
/**
* 加密函式
* @param string $str 明文
* @param string $key 密鑰
* @return string Base64 編碼的密文
*/
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;
}
?>
<?php $str = '作者:余浩苗;電話:13611972365;電子郵件:123cvbz@163.com'; $key = 'hacker'; $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,非標準加密 | 改用 openssl_encrypt() AES-256-GCM |
| 金鑰管理 | 硬編碼在程式碼 | 使用環境變數或金鑰管理系統 |
| 完整性驗證 | 無 | 加入 HMAC 或使用認證加密模式 |
| 抗重放攻擊 | 無 | 加入 timestamp + nonce 機制 |
<?php
function modern_encrypt($data, $key) {
$iv = random_bytes(16); // 128-bit IV
$ciphertext = openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
return base64_encode($iv . $tag . $ciphertext);
}
function modern_decrypt($data, $key) {
$data = base64_decode($data);
$iv = substr($data, 0, 16);
$tag = substr($data, 16, 16);
$ciphertext = substr($data, 32);
return openssl_decrypt($ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
}
?>
總結:舊版自訂函式可用於學習理解加密原理,正式專案請採用經過驗證的標準加密庫(如 openssl、libsodium)。