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

PHP 可逆加密解密演算法實作:自訂金鑰循環位移與 Base64 輸出(簡易版)

     編輯:PHP 綜合知識

本文提供一組精簡的 PHP 可逆加密/解密函式,採用「金鑰 MD5 後循環產生等長金鑰流,逐字元模 256 位移」的對稱加密邏輯,並以 Base64 編碼輸出。適合理解加密基本原理、輕量資料混淆或教學示範使用。

加密函式

<?php
function encrypt($data, $key) {
    $key = md5($key);
    $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);
}
?>

解密函式

<?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 = '123';

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

echo "加密: $encrypt\n"; // gniCSOzZG+HnS9zcFea7SefNGhXF
echo "解密: $decrypt\n"; // PHP加密解密演算法
?>

原理快速說明

  1. 金鑰經 md5() 固定為 32 字元十六進位字串。
  2. 循環取用金鑰字元,產生與明文等長的金鑰流 $char。
  3. 加密:(明文ASCII + 金鑰流ASCII) % 256 → 位元組 → Base64。
  4. 解密:Base64 解碼 → (密文ASCII - 金鑰流ASCII + 256) % 256 → 還原明文。

⚠️ 安全性提醒

  • 此為教學級簡易加密,不具備現代密碼學安全性(無認證加密、金鑰衍生弱、易受已知明文攻擊)。
  • 嚴禁用於:密碼儲存、支付資訊、API 金鑰、個資加密、任何合規要求場景。
  • 生產環境請用:openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag) 或 sodium_crypto_secretbox()。

現代替代:AES-256-GCM 範例

<?php
function aes_encrypt($data, $key) {
    $iv = random_bytes(12);
    $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