AES(Advanced Encryption Standard)為對稱加密標準,256 位鑰匙安全性高。PHP 早期依賴 mcrypt 擴展(已於 PHP 7.2 棄用、8.0 移除)。本文提供兩種方案:
包含 Aes(核心演算法:KeyExpansion、SubBytes、ShiftRows、MixColumns、AddRoundKey)與 AesCtr(CTR 模式封裝)。
<?php require 'aes.class.php'; require 'aesctr.class.php'; echo 'each change
'; $enc = AesCtr::encrypt('Hello World', 'key', 256); echo "Encrypt: $enc
"; $dec = AesCtr::decrypt($enc, 'key', 256); echo "Decrypt: $dec
"; echo 'each not change (keep=1)
'; $enc = AesCtr::encrypt('Hello World', 'key', 256, 1); echo "Encrypt: $enc
"; $dec = AesCtr::decrypt($enc, 'key', 256); echo "Decrypt: $dec
";
keep=1 固定 nonce,相同明文+金鑰產生相同密文(適合測試),預設 keep=0 使用時間戳+隨機數確保語意安全性。
function aes($ostr, $securekey, $type='encrypt') {
if(!$ostr) return '';
$key = $securekey; $iv = strrev($securekey);
$td = mcrypt_module_open('rijndael-256', '', 'ofb', ''); // 需 mcrypt
mcrypt_generic_init($td, $key, $iv);
$str = '';
switch($type) {
case 'encrypt': $str = base64_encode(mcrypt_generic($td, $ostr)); break;
case 'decrypt': $str = mdecrypt_generic($td, base64_decode($ostr)); break;
}
mcrypt_generic_deinit($td);
return $str;
}
// 建議改用 OpenSSL:
function aes_openssl($data, $key, $type='encrypt') {
$method = 'AES-256-CBC';
$iv = substr(hash('sha256', $key), 0, 16);
if($type==='encrypt') {
return base64_encode(openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv));
} else {
return openssl_decrypt(base64_decode($data), $method, $key, OPENSSL_RAW_DATA, $iv);
}
}
sodium_crypto_aead_*(Libsodium)。純 PHP AES 實作適合無法安裝擴展的環境或教學用途。正式專案強烈建議使用 OpenSSL AES-GCM 或 Libsodium,獲得硬體加速、標準化 API、持續安全更新。