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

PHP 可逆加密解密演算法實作:自訂金鑰 + Base64 編碼的對稱加密範例

     編輯:PHP 綜合知識

MD5、SHA1 等單向雜湊適合密碼驗證,但無法還原原始資料。若需「加密後仍可解密還原」(如 API Token、設定檔敏感欄位),需使用可逆的對稱加密。本文提供一組純 PHP 實作的加密/解密函式,採用「金鑰循環異或式位移」邏輯,並以 Base64 輸出便於儲存傳輸。

加密函式 encrypt()

<?php
function encrypt($data, $key) {
    $key = md5($key);                    // 固定長度 32 字元
    $x = 0;
    $len = strlen($data);
    $l = strlen($key);
    $char = '';

    // 產生與資料等長的金鑰流
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) $x = 0;
        $char .= $key[$x];
        $x++;
    }

    // 逐字元位移加密
    $str = '';
    for ($i = 0; $i < $len; $i++) {
        $str .= chr((ord($data[$i]) + ord($char[$i])) % 256);
    }
    return base64_encode($str);
}
?>

解密函式 decrypt()

<?php
function decrypt($data, $key) {
    $key = md5($key);
    $x = 0;
    $data = base64_decode($data);
    $len = strlen($data);
    $l = strlen($key);
    $char = '';

    // 重建金鑰流
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) $x = 0;
        $char .= $key[$x];
        $x++;
    }

    // 逆向位移還原
    $str = '';
    for ($i = 0; $i < $len; $i++) {
        $d = ord($data[$i]);
        $c = ord($char[$i]);
        if ($d < $c) {
            $str .= chr(($d + 256) - $c);
        } else {
            $str .= chr($d - $c);
        }
    }
    return $str;
}
?>

使用範例

<?php
$data = 'PHP加密解密演算法';
$key = 'my_secret_key_123';

$encrypted = encrypt($data, $key);
$decrypted = decrypt($encrypted, $key);

echo "加密結果: $encrypted\n"; // 類似: gniCSOzZG+HnS9zcFea7SefNGhXF
echo "解密結果: $decrypted\n"; // PHP加密解密演算法
?>

原理解析

  1. 金鑰衍生:md5($key) 產生固定 32 字元十六進位字串,作為種子。
  2. 金鑰流擴展:循環取用種子字元,產生與明文等長的偽隨機金鑰流 $char。
  3. 模 256 位移:明文每字元 ASCII 值與金鑰流對應字元值相加取模 256,確保結果在 0-255 範圍內(單一位元組)。
  4. Base64 輸出:將二進位結果編碼為可列印字串,便於資料庫、JSON、URL 儲存。
  5. 解密逆向:Base64 解碼 → 重建金鑰流 → 減法還原(處理負值加 256)。

安全性與適用場景

現代最佳實踐範例(AES-256-GCM)

<?php
function aes_encrypt($data, $key) {
    $iv = random_bytes(12); // GCM 建議 96-bit IV
    $ciphertext = openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
    return base64_encode($iv . $tag . $ciphertext);
}

function aes_decrypt($data, $key) {
    $data = base64_decode($data);
    $iv = substr($data, 0, 12);
    $tag = substr($data, 12, 16);
    $ciphertext = substr($data, 28);
    return openssl_decrypt($ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
}
?>

本文提供的自訂演算法適合理解加密原理與輕量混淆需求,正式專案請採用經過密碼學驗證的標準庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
項目說明
演算法強度屬簡易替換加密,非 AES 等標準加密,不適合高機密資料(金融、醫療、認證 Token)。
金鑰管理金鑰硬編碼於程式碼風險高,建議存放於環境變數或金鑰管理系統。
適用場景內部設定檔加密、低敏感度 API 參數混淆、教學示範、舊系統相容。
建議替代生產環境請使用 openssl_encrypt() (AES-256-GCM) 或 sodium_crypto_secretbox() (libsodium)。