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

PHP 字符串加密解密函數實現詳解

     編輯:PHP 相關知識

PHP 字符串加密解密函數實現詳解

在 PHP 開發中,經常需要對敏感字符串進行加密存儲或傳輸。本文介紹一個基於 RC4 流加密算法的自定義函數 encrypt(),支持加密與解密雙向操作,並提供完整的代碼示例。

函數設計思路

該函數採用對稱加密機制,核心步驟包括:

  • 使用 MD5 對密鑰進行哈希處理,生成 256 字節的密鑰盒(S-box)
  • 通過鍵調度算法(KSA)初始化 S-box
  • 利用偽隨機生成算法(PRGA)產生密鑰流,與明文/密文進行 XOR 運算
  • 加密時在數據前附加 8 字節校驗碼(MD5 前 8 位),解密時驗證完整性
  • 最終輸出經 Base64 編碼的字符串(去除填充字符 '=')

完整代碼實現

/*********************************************************************
 函數名稱: encrypt
 函數作用: 加密解密字符串
 使用方法:
   加密: encrypt('str', 'E', 'nowamagic')
   解密: encrypt('被加密過的字符串', 'D', 'nowamagic')
 參數說明:
   $string  : 需要加密解密的字符串
   $operation: 判斷是加密還是解密: E:加密 D:解密
   $key     : 加密的鑰匙(密匙)
 *********************************************************************/
function encrypt($string, $operation, $key = '') {
    $key = md5($key);
    $key_length = strlen($key);
    $string = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
    $string_length = strlen($string);
    $rndkey = $box = array();
    $result = '';
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($key[$i % $key_length]);
        $box[$i] = $i;
    }
    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if ($operation == 'D') {
        if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
            return substr($result, 8);
        } else {
            return '';
        }
    } else {
        return str_replace('=', '', base64_encode($result));
    }
}

使用示例

$id = 132;
$token = encrypt($id, 'E', 'a');
echo '加密: ' . $token . '<br />';
echo '解密: ' . encrypt($token, 'D', 'a');

安全性說明

此實現屬於教學級示例,實際生產環境建議使用 PHP 內置的 openssl_encrypt()/openssl_decrypt() 或 sodium 擴展提供的現代加密算法(如 AES-256-GCM、ChaCha20-Poly1305),並妥善管理密鑰生命周期。

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