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

PHP 可逆加密解密函數組合:Base64 + 亂數鍵值 + XOR 混淆

     編輯:PHP 綜合知識

一組輕量級的 PHP 可逆加密解密函數,結合 Base64、動態亂數鍵值、XOR 位運算與固定金鑰二次混淆,適用於非極高安全需求的參數傳遞、Token 生成、URL 簽名等場景。

完整代碼

<?php
/**
 * 加密函數
 * @param string $str 明文
 * @param string $key 密鑰
 * @return string 密文
 */
function passport_encrypt($str, $key) {
    srand((double)microtime() * 1000000);
    $encrypt_key = md5(rand(0, 32000)); // 動態亂數鍵
    $ctr = 0;
    $tmp = '';
    for ($i = 0; $i < strlen($str); $i++) {
        $ctr = ($ctr == strlen($encrypt_key)) ? 0 : $ctr;
        $tmp .= $encrypt_key[$ctr] . ($str[$i] ^ $encrypt_key[$ctr++]);
    }
    return base64_encode(passport_key($tmp, $key));
}

/**
 * 解密函數
 * @param string $str 密文
 * @param string $key 密鑰
 * @return string 明文
 */
function passport_decrypt($str, $key) {
    $str = passport_key(base64_decode($str), $key);
    $tmp = '';
    for ($i = 0; $i < strlen($str); $i++) {
        $md5 = $str[$i];
        $tmp .= $str[++$i] ^ $md5;
    }
    return $tmp;
}

/**
 * 輔助函數:固定金鑰二次 XOR
 */
function passport_key($str, $encrypt_key) {
    $encrypt_key = md5($encrypt_key);
    $ctr = 0;
    $tmp = '';
    for ($i = 0; $i < strlen($str); $i++) {
        $ctr = ($ctr == strlen($encrypt_key)) ? 0 : $ctr;
        $tmp .= $str[$i] ^ $encrypt_key[$ctr++];
    }
    return $tmp;
}

// 測試
$str = '作者:WWW.JB51.NET';
$key = 'jb51net';
$encrypt = passport_encrypt($str, $key);
$decrypt = passport_decrypt($encrypt, $key);

echo '原文:', $str, "<br><hr>";
echo '密文:', $encrypt, "<br><hr>";
echo '譯文:', $decrypt, "<br><hr>";
?>

演算法流程

  1. 加密:
    1. 生成 32 字元 MD5 動態鍵 $encrypt_key;
    2. 明文逐字元與動態鍵 XOR,並將動態鍵字元插入結果中(交織);
    3. 交織結果經 passport_key() 用固定金鑰 md5($key) 二次 XOR;
    4. base64_encode 輸出可列印字串。
  2. 解密:逆向操作——Base64 解碼 → 固定金鑰 XOR 還原 → 讀取交織動態鍵 → XOR 還原明文。

特性分析

特性說明
可逆性對稱加密,同金鑰可解密
密文長度約明文 2~3 倍(含交織鍵 + Base64)
抗暴力破解低(動態鍵空間小、XOR 線性、無完整性驗證)
效能極快,純 PHP 迴圈,適合高頻調用
適用場景內部參數混淆、短時效 Token、非敏感資料傳遞

安全建議

  • 勿用於高敏感資料(密碼、金流、個資),請改用 openssl_encrypt (AES-256-GCM) 或 sodium (libsodium);
  • 金鑰管理:$key 應從環境變數/配置檔讀取,勿硬編碼;
  • 完整性:傳輸前加上 HMAC-SHA256 簽名,防篡改;
  • 時效性:密文加入時間戳,設定過期時間;
  • 隨機性:srand((double)microtime() * 1000000) 在 PHP 4.2+ 已自動播種,可移除。

現代替代方案

// 推薦:AES-256-GCM (PHP 7.1+)
function encrypt_modern($data, $key) {
    $iv = random_bytes(12);
    $ct = openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
    return base64_encode($iv . $tag . $ct);
}

function decrypt_modern($payload, $key) {
    $raw = base64_decode($payload);
    $iv = substr($raw, 0, 12);
    $tag = substr($raw, 12, 16);
    $ct = substr($raw, 28);
    return openssl_decrypt($ct, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
}

經典演算法適合學習加密原理,生產環境請優先採用經過密碼學驗證的現代庫。

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