在 PHP 開發中,經常需要對敏感字符串進行加密存儲或傳輸。本文介紹一個基於 RC4 流加密算法的自定義函數 encrypt(),支持加密與解密雙向操作,並提供完整的代碼示例。
該函數採用對稱加密機制,核心步驟包括:
/*********************************************************************
函數名稱: 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),並妥善管理密鑰生命周期。