本文分析一個基於 XOR 運算和動態密鑰流的可逆加密類,展示其原理、代碼結構,並指出其安全局限性與現代替代方案。
md5(rand(0,32000)) 生成 32 字符十六進制隨機密鑰流 $encrypt_key。$key(經 md5)對上述結果再次 XOR(keyED 方法)。$key 解混淆,再按「取密鑰流字節 → XOR 還原明文字節」還原。class Crypt {
protected $key = '';
private function keyED($txt, $encrypt_key) { /* XOR 混淆 */ }
public function encrypt($txt, $key = '') { /* 生成隨機流、穿插 XOR、二次混淆 */ }
public function decrypt($txt, $key = '') { /* 逆向還原 */ }
public function setKey($key) { $this->key = $key; }
public function getKey() { return $this->key; }
}
| 維度 | 評價 | 風險 |
|---|---|---|
| 算法類型 | 流密碼(XOR) | 已知明文攻擊可恢復密鑰流 |
| 隨機源 | rand() + md5() | 不可預測性極弱,PHP 7.1+ rand() 為偽隨機,不宜用於加密 |
| 密鑰管理 | 硬編碼/傳遞明文密鑰 | 無密鑰派生函數(KDF),無鹽值,無輪換機制 |
| 完整性校驗 | 無 | 密文可被篡改且解密不報錯 |
| 初始化向量 | 無 | 相同明文+密鑰產生完全相同密文,洩露模式 |
結論:此類僅適合**教學演示、極低敏感度數據混淆**(如隱藏內部 ID、簡單 Token 混淆),嚴禁用於:用戶密碼、支付信息、個人隱私、API 簽名、任何合規要求加密的場景。
function encryptModern(string $data, string $key): string {
$iv = random_bytes(12); // 96-bit IV for GCM
$ciphertext = openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
// 存儲格式:IV(12) + TAG(16) + CIPHERTEXT
return base64_encode($iv . $tag . $ciphertext);
}
function decryptModern(string $payload, string $key): ?string {
$raw = base64_decode($payload);
if (strlen($raw) < 28) return null;
$iv = substr($raw, 0, 12);
$tag = substr($raw, 12, 16);
$ciphertext = substr($raw, 28);
return openssl_decrypt($ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
}
// 密鑰派生(從密碼)
$key = hash_pbkdf2('sha256', $password, $salt, 100000, 32, true);
random_bytes() 生成 IV/鹽值(CSPRNG)。版本|鹽值|IV|TAG|密文,支持算法升級。paragonie/halite、defuse/php-encryption、Laravel Encrypter。理解經典 XOR 加密原理是學習現代密碼學的入門,但生產代碼請擁抱經過學術界驗證、工程界檢驗的標準庫與算法。