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

PHP 實作 AES-256 加密演算法:純 PHP 實現與 mcrypt 替代方案

     編輯:PHP 相關知識

前言

AES(Advanced Encryption Standard)為對稱加密標準,256 位鑰匙安全性高。PHP 早期依賴 mcrypt 擴展(已於 PHP 7.2 棄用、8.0 移除)。本文提供兩種方案:

  1. 純 PHP 實作(Chris Veness 版本):無擴展相依、支援 CTR 模式、可跨平台。
  2. OpenSSL / Sodium:現代 PHP 內建擴展,效能更好、經過安全審計。

方案一:純 PHP AES-CTR 類別

包含 Aes(核心演算法:KeyExpansion、SubBytes、ShiftRows、MixColumns、AddRoundKey)與 AesCtr(CTR 模式封裝)。

<?php
require 'aes.class.php';
require 'aesctr.class.php';

echo 'each change
'; $enc = AesCtr::encrypt('Hello World', 'key', 256); echo "Encrypt: $enc
"; $dec = AesCtr::decrypt($enc, 'key', 256); echo "Decrypt: $dec
"; echo 'each not change (keep=1)
'; $enc = AesCtr::encrypt('Hello World', 'key', 256, 1); echo "Encrypt: $enc
"; $dec = AesCtr::decrypt($enc, 'key', 256); echo "Decrypt: $dec
";

keep=1 固定 nonce,相同明文+金鑰產生相同密文(適合測試),預設 keep=0 使用時間戳+隨機數確保語意安全性。

方案二:OpenSSL 簡易封裝

function aes($ostr, $securekey, $type='encrypt') {
    if(!$ostr) return '';
    $key = $securekey; $iv = strrev($securekey);
    $td = mcrypt_module_open('rijndael-256', '', 'ofb', ''); // 需 mcrypt
    mcrypt_generic_init($td, $key, $iv);
    $str = '';
    switch($type) {
        case 'encrypt': $str = base64_encode(mcrypt_generic($td, $ostr)); break;
        case 'decrypt': $str = mdecrypt_generic($td, base64_decode($ostr)); break;
    }
    mcrypt_generic_deinit($td);
    return $str;
}
// 建議改用 OpenSSL:
function aes_openssl($data, $key, $type='encrypt') {
    $method = 'AES-256-CBC';
    $iv = substr(hash('sha256', $key), 0, 16);
    if($type==='encrypt') {
        return base64_encode(openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv));
    } else {
        return openssl_decrypt(base64_decode($data), $method, $key, OPENSSL_RAW_DATA, $iv);
    }
}

關鍵安全提醒

  • 金鑰管理:勿硬編碼金鑰,使用環境變數、金鑰管理服務(KMS)。
  • IV/Nonce 唯一性:CBC 模式 IV 必須隨機且唯一;CTR 模式 Nonce 不可重複使用。
  • 認證加密:純加密無法防範密文竄改,生產環境應使用 AES-GCM(OpenSSL 支援)或 sodium_crypto_aead_*(Libsodium)。
  • 填充模式:CBC 需 PKCS7 填充,OpenSSL 預設處理。

結語

純 PHP AES 實作適合無法安裝擴展的環境或教學用途。正式專案強烈建議使用 OpenSSL AES-GCM 或 Libsodium,獲得硬體加速、標準化 API、持續安全更新。

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