MD5、SHA1 等單向雜湊適合密碼驗證,但無法還原原始資料。若需「加密後仍可解密還原」(如 API Token、設定檔敏感欄位),需使用可逆的對稱加密。本文提供一組純 PHP 實作的加密/解密函式,採用「金鑰循環異或式位移」邏輯,並以 Base64 輸出便於儲存傳輸。
encrypt()<?php
function encrypt($data, $key) {
$key = md5($key); // 固定長度 32 字元
$x = 0;
$len = strlen($data);
$l = strlen($key);
$char = '';
// 產生與資料等長的金鑰流
for ($i = 0; $i < $len; $i++) {
if ($x == $l) $x = 0;
$char .= $key[$x];
$x++;
}
// 逐字元位移加密
$str = '';
for ($i = 0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 256);
}
return base64_encode($str);
}
?>
decrypt()<?php
function decrypt($data, $key) {
$key = md5($key);
$x = 0;
$data = base64_decode($data);
$len = strlen($data);
$l = strlen($key);
$char = '';
// 重建金鑰流
for ($i = 0; $i < $len; $i++) {
if ($x == $l) $x = 0;
$char .= $key[$x];
$x++;
}
// 逆向位移還原
$str = '';
for ($i = 0; $i < $len; $i++) {
$d = ord($data[$i]);
$c = ord($char[$i]);
if ($d < $c) {
$str .= chr(($d + 256) - $c);
} else {
$str .= chr($d - $c);
}
}
return $str;
}
?>
<?php
$data = 'PHP加密解密演算法';
$key = 'my_secret_key_123';
$encrypted = encrypt($data, $key);
$decrypted = decrypt($encrypted, $key);
echo "加密結果: $encrypted\n"; // 類似: gniCSOzZG+HnS9zcFea7SefNGhXF
echo "解密結果: $decrypted\n"; // PHP加密解密演算法
?>
md5($key) 產生固定 32 字元十六進位字串,作為種子。$char。| 項目 | 說明 |
|---|---|
| 演算法強度 | 屬簡易替換加密,非 AES 等標準加密,不適合高機密資料(金融、醫療、認證 Token)。 |
| 金鑰管理 | 金鑰硬編碼於程式碼風險高,建議存放於環境變數或金鑰管理系統。 |
| 適用場景 | 內部設定檔加密、低敏感度 API 參數混淆、教學示範、舊系統相容。 |
| 建議替代 | 生產環境請使用 openssl_encrypt() (AES-256-GCM) 或 sodium_crypto_secretbox() (libsodium)。 |