本文提供一組精簡的 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加密解密演算法
?>
md5() 固定為 32 字元十六進位字串。$char。(明文ASCII + 金鑰流ASCII) % 256 → 位元組 → Base64。(密文ASCII - 金鑰流ASCII + 256) % 256 → 還原明文。openssl_encrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag) 或 sodium_crypto_secretbox()。<?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);
}
?>
理解簡易演算法有助於建立密碼學直覺,實務開發請務必採用經驗證的標準庫。