首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 3DES 加密報錯 Call to undefined function mcrypt_module_open() 解決方案:安裝 libmcrypt.dll、配置 php.ini、Apache 載入

     編輯:PHP 相關知識

PHP 3DES 加密報錯 Call to undefined function mcrypt_module_open() 解決方案:安裝 libmcrypt.dll、配置 php.ini、Apache 載入

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 時,擴展無法載入,函數未定義。

修復步驟 (Windows + Apache + PHP)

  1. 取得 libmcrypt.dll: 從 PHP 官方下載頁面對應版本的 ZIP 包中提取,或從可信來源下載 (注意 32/64 位匹配 PHP 版本)。
  2. 放置 DLL (三選一,建議全放):
    • C:\Windows\System32\ (系統全域)
    • D:\php\ext\ (PHP 擴展目錄)
    • D:\Apache24\bin\ (Apache 執行目錄,最關鍵,因 Apache 載入 PHP 模組時的工作目錄)
  3. 配置 php.ini (必須修改 Apache 使用的 php.ini):
    ; 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 確認實際生效檔案。

  4. 重啟 Apache 服務: httpd -k restart 或服務管理器重啟。
  5. 驗證: 瀏覽 phpinfo() 頁面,搜尋 mcrypt 應顯示支援資訊;執行原報錯腳本不再報錯。

完整 3DES 加密類別範例 (修復後可直接使用)

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 已棄用,請改用 OpenSSL

特性mcrypt (legacy)OpenSSL (推薦)
PHP 版本≤ 7.1 (7.2 移除)5.3+ (持續更新)
算法支援有限完整 (AES, ChaCha20, 3DES 等)
效能一般硬體加速 (AES-NI)
維護狀態已停止活躍

OpenSSL 版 3DES 實作 (PHP 7.2+)

 0 && $pad <= 8) ? substr($dec, 0, -$pad) : $dec;
}

建議: 新專案直接使用 OpenSSL AES-256-GCM (認證加密),僅在需與老系統 (Java 等) 互通 3DES 時才使用上述代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved