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

PHP 自定義加密解密與 DES 實現詳解(附完整類)

     編輯:PHP 綜合知識

一、自定義對稱加密算法

基於 XOR 運算與動態密鑰流,適合輕量級數據混淆,非軍用級安全。

核心函數

<?php
// 輔助函數:密鑰流 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;
}

// 加密
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));
}

// 解密
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;
}

// 測試
$str = '作者:www.jb51.net';
$key = '123456';
$enc = passport_encrypt($str, $key);
$dec = passport_decrypt($enc, $key);
echo "原文:$str
密文:$enc
譯文:$dec"; ?>

二、標準 DES 加密類(CBC 模式 + PKCS5 填充)

注意:mcrypt 擴展自 PHP 7.1 棄用,PHP 7.2+ 移除。現代項目請改用 openssl_encrypt (AES)。本類僅供維護舊項目參考。

完整類代碼

<?php
class DES {
    private $key;
    private $iv;

    public function __construct($key, $iv = 0) {
        $this->key = $key; // 必須 8 字節
        $this->iv = ($iv == 0) ? $key : $iv;
    }

    // 加密 → 大寫十六進制字符串
    public function encrypt($str) {
        $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
        $str = $this->pkcs5Pad($str, $size);
        return strtoupper(bin2hex(mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv)));
    }

    // 解密
    public function decrypt($str) {
        $strBin = $this->hex2bin(strtolower($str));
        $str = mcrypt_cbc(MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv);
        return $this->pkcs5Unpad($str);
    }

    // 十六進制轉二進制
    private function hex2bin($hexData) {
        $binData = '';
        for ($i = 0; $i < strlen($hexData); $i += 2) {
            $binData .= chr(hexdec(substr($hexData, $i, 2)));
        }
        return $binData;
    }

    // PKCS5 填充
    private function pkcs5Pad($text, $blocksize) {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }

    // PKCS5 去填充
    private function pkcs5Unpad($text) {
        $pad = ord($text[strlen($text) - 1]);
        if ($pad > strlen($text)) return false;
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
        return substr($text, 0, -$pad);
    }
}

// 測試
$des = new DES('1234abcd');
$encrypted = $des->encrypt('12345678');
$decrypted = $des->decrypt($encrypted);
echo "$decrypted <=> $encrypted";
?>

三、URL 參數 Base64 編碼傳遞技巧

<?php
// 加密傳遞參數
function args_encode($data) {
    return is_array($data) ? base64_encode(http_build_query($data)) : false;
}

// 解密獲取參數
function getargs() {
    parse_str(base64_decode($_GET['args']), $g);
    return $g;
}
?>

現代替代方案建議

  • AES-256-CBC:openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv)
  • Libsodium (PHP 7.2+):sodium_crypto_secretbox() 簡單且抗邊信道攻擊。
  • 密鑰管理:使用環境變量或密鑰管理服務(KMS),勿硬編碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved