PHP 使用 mcrypt 擴展進行 3DES 加密時,若缺少 libmcrypt.dll 依賴庫,會拋出 Call to undefined function mcrypt_module_open()。本文提供 Windows 環境下的完整修復步驟:取得 DLL、放置路徑、配置 php.ini、重啟 Apache 驗證。
php_mcrypt.dll (PHP 擴展) 依賴 libmcrypt.dll (C 庫)。Windows 系統目錄或 Apache 執行目錄找不到此 DLL 時,擴展無法載入,函數未定義。
C:\Windows\System32\ (系統全域)D:\php\ext\ (PHP 擴展目錄)D:\Apache24\bin\ (Apache 執行目錄,最關鍵,因 Apache 載入 PHP 模組時的工作目錄); 1. 確認 extension_dir 指向正確
extension_dir = "D:/php/ext"
; 2. 啟用 mcrypt 擴展 (去掉分號)
extension=php_mcrypt.dll
; 3. 若有 iconv 也建議啟用
extension=php_iconv.dll
關鍵: 請確認修改的是 C:\Windows\php.ini 或 Apache 載入的 PHPIniDir 指向的 php.ini,而非 PHP 目錄下的備份檔。用 phpinfo() 查看 Loaded Configuration File 確認實際生效檔案。
httpd -k restart 或服務管理器重啟。phpinfo() 頁面,搜尋 mcrypt 應顯示支援資訊;執行原報錯腳本不再報錯。pkcs7Pad($input);
$key = base64_decode($this->key);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, $key, $this->iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return rtrim(base64_encode($data), "\r\n");
}
public function decrypt($encrypted) {
$data = base64_decode($encrypted);
$key = base64_decode($this->key);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, $key, $this->iv);
$decrypted = mdecrypt_generic($td, $data);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $this->pkcs7Unpad($decrypted);
}
private function pkcs7Pad($str) {
$block = 8;
$pad = $block - (strlen($str) % $block);
return $str . str_repeat(chr($pad), $pad);
}
private function pkcs7Unpad($str) {
$pad = ord($str[strlen($str) - 1]);
if ($pad > 0 && $pad <= 8) {
return substr($str, 0, -$pad);
}
return $str;
}
}
// 測試
$crypt = new Crypt3Des();
$plain = "1qaz2ws";
$enc = $crypt->encrypt($plain);
$dec = $crypt->decrypt($enc);
echo "Plain: $plain\nEnc: $enc\nDec: $dec\n";
| 特性 | mcrypt (legacy) | OpenSSL (推薦) |
|---|---|---|
| PHP 版本 | ≤ 7.1 (7.2 移除) | 5.3+ (持續更新) |
| 算法支援 | 有限 | 完整 (AES, ChaCha20, 3DES 等) |
| 效能 | 一般 | 硬體加速 (AES-NI) |
| 維護狀態 | 已停止 | 活躍 |
0 && $pad <= 8) ? substr($dec, 0, -$pad) : $dec;
}
建議: 新專案直接使用 OpenSSL AES-256-GCM (認證加密),僅在需與老系統 (Java 等) 互通 3DES 時才使用上述代碼。