mcrypt 擴展提供多種加密算法,本文以 Twofish/ECB 模式為例,演示完整的加密、解密流程。注意:mcrypt 自 PHP 7.1 棄用,7.2 移除,新專案請改用 openssl 或 sodium。
<?php
function make_seed() {
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}
srand(make_seed());
// 1. 開啟模組
$td = mcrypt_module_open('twofish', '', 'ecb', '');
// 2. 建立 IV 並取得金鑰長度
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$ks = mcrypt_enc_get_key_size($td);
// 3. 產生金鑰(此處以 MD5 衍生,實際應用請用 PBKDF2 等 KDF)
$key = substr(md5('very secret key'), 0, $ks);
// 4. 初始化加密
mcrypt_generic_init($td, $key, $iv);
// 5. 加密
$encrypted = mcrypt_generic($td, 'This is very important data');
print $encrypted;
// 6. 解密前重新初始化
mcrypt_generic_deinit($td);
mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $encrypted);
// 7. 清理資源
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
// 8. 輸出驗證
echo trim($decrypted) . " ";
?>
hash_pbkdf2)並安全儲存金鑰。mcrypt_generic_init/deinit 及 mcrypt_module_close 避免洩漏。// 使用 openssl (AES-256-CBC)
$key = hash_pbkdf2('sha256', $password, $salt, 100000, 32, true);
$iv = random_bytes(16);
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
建議所有新專案遷移至 openssl 或 libsodium,以獲得持續的安全更新與效能優化。