異或運算 (XOR) 具備 自逆性:A ^ K = B,則 B ^ K = A。同一密鑰對文件每字節異或即可加密,再執行一次即解密。

<?php
$source = 'test.jpg';
$encrypt_file = 'test_enc.jpg';
$decrypt_file = 'test_dec.jpg';
$key = 'D89475D32EA8BBE933DBD299599EEA3E';
echo '<p>Source:</p><img src="'.$source.'" width="200"><hr>';
file_encrypt($source, $encrypt_file, $key);
echo '<p>Encrypted:</p><img src="'.$encrypt_file.'" width="200"><hr>';
file_encrypt($encrypt_file, $decrypt_file, $key);
echo '<p>Decrypted:</p><img src="'.$decrypt_file.'" width="200">';
function file_encrypt($source, $dest, $key) {
if (!file_exists($source)) return false;
$content = '';
$keylen = strlen($key);
$index = 0;
$fp = fopen($source, 'rb');
while (!feof($fp)) {
$byte = fread($fp, 1);
$content .= $byte ^ $key[$index % $keylen];
$index++;
}
fclose($fp);
return file_put_contents($dest, $content, LOCK_EX);
}
?>
| 問題 | 風險 | 改進 |
|---|---|---|
| 密鑰重複使用 | 已知明文攻擊可破解 | 每文件生成隨機 IV,密鑰派生 PBKDF2 |
| 無完整性驗證 | 密文可被竄改 | 加密後附加 HMAC-SHA256 |
| ECB 模式等效 | 相同塊產生相同密文 | 採用 AES-CBC/GCM 等成熟算法 |
結論:XOR 適合教學、簡易混淆,**生產環境嚴禁**用於機密數據,請使用 openssl_encrypt (AES-256-GCM) 或 libsodium。