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

PHP mcrypt 加解密實戰:Twofish 算法範例

     編輯:PHP 相關知識

前言

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) . " ";
?>

關鍵點解析

  • IV (Initialization Vector):ECB 模式雖不強制使用 IV,但函式仍需傳入;CBC 等模式則必須妥善保存 IV 以供解密。
  • 金鑰管理:範例直接用 MD5 截取,生產環境必須使用安全的金鑰衍生函數(如 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,以獲得持續的安全更新與效能優化。

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