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

PHP 結合 MD5 實現加密解密的經典範例(基於 MCrypt 擴展)

     編輯:PHP 綜合知識

前言

在早期的 PHP 開發中,資料加密與解密是常見需求。本文介紹一種結合 MD5 雜湊與 MCrypt 擴展的對稱加密演示,雖然 MCrypt 已在 PHP 7.2 中移除,但理解其原理對維護舊專案或學習加密概念仍有價值。

核心程式碼解析

以下範例展示了使用 DES 演算法(ECB 模式)進行加解密的完整流程:

// 加密函式
function string2secret($str) {
    $key = "123"; // 密鑰種子
    $td = mcrypt_module_open(MCRYPT_DES, '', 'ecb', '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    $ks = mcrypt_enc_get_key_size($td);
    // 取 MD5 前 $ks 位作為實際金鑰
    $key = substr(md5($key), 0, $ks);
    
    mcrypt_generic_init($td, $key, $iv);
    $secret = mcrypt_generic($td, $str);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $secret;
}

// 解密函式
function secret2string($sec) {
    $key = "123";
    $td = mcrypt_module_open(MCRYPT_DES, '', 'ecb', '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    $ks = mcrypt_enc_get_key_size($td);
    $key = substr(md5($key), 0, $ks);
    
    mcrypt_generic_init($td, $key, $iv);
    $string = mdecrypt_generic($td, $sec);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return trim($string);
}

// 測試
echo secret2string(string2secret("11111111111111111")); // 輸出原文
echo string2secret("11111111111111111"); // 輸出密文(亂碼)

關鍵點說明

  • 金鑰衍生:使用 md5($key) 產生 32 字元十六進位字串,再截取演算法所需長度(DES 為 8 位元組)。
  • 初始化向量 (IV):ECB 模式雖不強制要求 IV,但範例中仍建立了隨機 IV。
  • 資源管理:嚴格遵循 mcrypt_generic_init → 加解密 → mcrypt_generic_deinit → mcrypt_module_close 的生命週期。

現代替代方案

PHP 7.1+ 建議改用 OpenSSL 或 Sodium (libsodium) 擴展:

// 使用 OpenSSL AES-256-CBC 範例
$key = hash('sha256', 'my_secret_key', true);
$iv = random_bytes(16);
$ciphertext = openssl_encrypt($plaintext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
// 儲存時將 $iv 與 $ciphertext 組合(如 base64_encode($iv.$ciphertext))

常見編碼輔助函式

實務上常搭配 base64_encode / base64_decode 將二進位密文轉為可安全傳輸的字串。

更多 PHP 加解密技巧請參考專題:《PHP 加密方法總結》

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