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

PHP 可逆加密解密函式實作詳解

     編輯:PHP 綜合知識

分享一組自訂的 PHP 加密/解密函式,採用動態金鑰與 XOR 運算結合 Base64 編碼,適合輕量級資料保護(如 API 參數傳遞、Token 生成等)。注意:此為對稱加密,不適合儲存密碼等高敏感資料,密碼請使用 password_hash() / password_verify()。

核心程式碼

<?php
/**
 * 加密函式
 * @param string $str  明文
 * @param string $key  密鑰
 * @return string      Base64 編碼的密文
 */
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;
}
?>

使用範例

<?php
$str = '作者:余浩苗;電話:13611972365;電子郵件:123cvbz@163.com';
$key = 'hacker';

$encrypt = passport_encrypt($str, $key);
$decrypt = passport_decrypt($encrypt, $key);

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

原理解析

  1. 動態金鑰:每次加密產生隨機 $encrypt_key,相同明文加密結果不同,增加破解難度
  2. 雙層 XOR:先與動態金鑰 XOR,再與固定金鑰 MD5 後 XOR
  3. Base64 封裝:確保密文可安全在 URL、JSON、表單中傳輸

安全性評估與改進建議

項目現狀建議
演算法強度自訂 XOR,非標準加密改用 openssl_encrypt() AES-256-GCM
金鑰管理硬編碼在程式碼使用環境變數或金鑰管理系統
完整性驗證無加入 HMAC 或使用認證加密模式
抗重放攻擊無加入 timestamp + nonce 機制

現代 PHP 推薦寫法(PHP 7.1+)

<?php
function modern_encrypt($data, $key) {
    $iv = random_bytes(16);  // 128-bit IV
    $ciphertext = openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
    return base64_encode($iv . $tag . $ciphertext);
}

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

總結:舊版自訂函式可用於學習理解加密原理,正式專案請採用經過驗證的標準加密庫(如 openssl、libsodium)。

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