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

PHP 加強版加密解密類實現:基於隨機密鑰與 Base64 的可逆加密方案

     編輯:PHP 相關知識

PHP 加強版加密解密類實現:基於隨機密鑰與 Base64 的可逆加密方案

本文介紹一個功能完善的 PHP 加密解密類 Ender,採用動態隨機密鑰配合 Base64 編碼,並處理特殊字符替換,適合 API 簽名、Token 生成、敏感數據傳輸等場景。

核心設計特點

  • 雙層加密:隨機生成的一次性密鑰 + 用戶主密鑰
  • 字符安全:自動替換 Base64 中的 = 為自定義字符(默認 #),避免 URL 傳輸問題
  • 靈活密鑰管理:支援構造函數注入與動態設置

完整類代碼

<?php
class Ender {
    private $enkey;      // 主加密密鑰
    private $rep_char = '#'; // Base64 填充字符替換

    public function __construct($key = '') {
        $this->enkey = $key;
    }

    public function set_key($key) {
        $this->enkey = $key;
    }

    /** 核心異或運算 */
    private function keyED($txt, $encrypt_key) {
        $encrypt_key = md5($encrypt_key);
        $ctr = 0;
        $tmp = "";
        for ($i = 0; $i < strlen($txt); $i++) {
            if ($ctr == strlen($encrypt_key)) $ctr = 0;
            $tmp .= substr($txt, $i, 1) ^ substr($encrypt_key, $ctr, 1);
            $ctr++;
        }
        return $tmp;
    }

    /** 加密入口 */
    public function encrypt($txt, $key = '') {
        if (!$key) $key = $this->enkey;
        srand((double)microtime() * 1000000);
        $encrypt_key = md5(rand(0, 32000)); // 隨機一次性密鑰
        $ctr = 0;
        $tmp = "";
        for ($i = 0; $i < strlen($txt); $i++) {
            if ($ctr == strlen($encrypt_key)) $ctr = 0;
            // 交織隨機密鑰字符與異或結果
            $tmp .= substr($encrypt_key, $ctr, 1) . (substr($txt, $i, 1) ^ substr($encrypt_key, $ctr, 1));
            $ctr++;
        }
        // 主密鑰二次加密 + Base64 + 字符替換
        $r = base64_encode($this->keyED($tmp, $key));
        $r = str_replace('=', $this->rep_char, $r);
        return $r;
    }

    /** 解密入口 */
    public function decrypt($txt, $key = '') {
        $txt = str_replace($this->rep_char, '=', $txt); // 還原填充字符
        $txt = base64_decode($txt);
        if (!$key) $key = $this->enkey;
        $txt = $this->keyED($txt, $key); // 主密鑰解密
        $tmp = "";
        for ($i = 0; $i < strlen($txt); $i++) {
            $md5 = substr($txt, $i, 1); // 提取隨機密鑰字符
            $i++;
            $tmp .= (substr($txt, $i, 1) ^ $md5); // 異或還原明文
        }
        return $tmp;
    }
}
?>

使用示例

<?php
require_once 'Ender.php';

$ender = new Ender('my_secret_key_2024');
$original = '敏感數據:用戶ID=12345,金額=999.99';

$encrypted = $ender->encrypt($original);
echo "加密結果: $encrypted\n";

$decrypted = $ender->decrypt($encrypted);
echo "解密結果: $decrypted\n";

// 驗證
assert($original === $decrypted, '加解密不一致');

加密流程圖解

  1. 明文 "Hello"
  2. 生成隨機密鑰 如 md5(rand()) → a1b2c3...
  3. 交織混淆:每個明文字符與隨機密鑰對應字符異或,並插入密鑰字符 → aH1e2b3l4l5o6...
  4. 主密鑰加密:用 keyED() 再次異或
  5. Base64 編碼 + = 替換為 #

解密流程

  1. 字符替換還原 # → =
  2. Base64 解碼
  3. 主密鑰異或解密
  4. 提取交織的隨機密鑰字符,異或還原明文

安全性分析

特性說明
抗重放攻擊每次加密使用隨機密鑰,相同明文產生不同密文
密鑰分離傳輸密鑰與存儲密鑰分離,洩露隨機密鑰無法破解主密鑰
字符安全自動處理 Base64 特殊字符,適合 URL/JSON 傳輸
對稱加密同一密鑰加解密,需妥善保管主密鑰

適用場景與建議

  • ✅ API 參數簽名、Token 生成、配置文件加密
  • ✅ 低敏感度數據的網絡傳輸保護
  • ⚠️ 高安全性場景(支付、身份認證)建議使用 OpenSSL 非對稱加密
  • ⚠️ 大數據量加密性能受限於 PHP 循環,考慮 C 擴展或 OpenSSL

此類庫代碼結構清晰,易於擴展(如添加 HMAC 完整性校驗、支援更多字符集),是 PHP 專案中快速集成加密功能的不錯選擇。

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