在開發中,很多時候我們會用到加密算法對數據進行處理。而在PHP 中,有一個非常強大的函數—— pack() ,它常用於二進制數據的格式化處理。儘管它不是傳統意義上的加密函數,但合理運用pack()可以配合我們構建自定義加密算法的“打包邏輯”。
pack()函數的作用是將數據按照指定的格式打包為二進製字符串。它的基本語法如下:
string pack ( string $format , mixed $values [, mixed $... ] )
其中$format是一個格式字符串,用來指定如何打包後續的$values參數。例如:
$binary = pack("N", 123456); // 按照 32 位無符號長整型(big-endian)打包數字
我們可以將數據打包為二進制形式,然後通過base64 編碼或者自定義轉換規則進行“加密”。雖然這種方式不能與AES、RSA 等專業加密算法相提並論,但在某些非關鍵數據場景下,它提供了一種輕量級的保護思路。
假設我們要加密的數據包含如下幾個部分:
用戶ID(整數)
時間戳(整數)
操作類型(1 字節標識符)
固定校驗碼(字符串)
下面我們用pack()打包這些內容:
function custom_encrypt($userId, $actionType) {
$timestamp = time();
$checkCode = 'm66'; // 固定校驗碼
// 將數據打包為二進製字符串
$binaryData = pack("NNCa3", $userId, $timestamp, $actionType, $checkCode);
// 使用 base64 編碼,生成最終可傳輸的“加密”字符串
return base64_encode($binaryData);
}
其中格式字符串"NNCa3"的含義如下:
N :32 位無符號長整型(userId)
N :32 位無符號長整型(timestamp)
C :8 位無符號字符(actionType)
a3 :3 字節字符串(checkCode)
我們可以測試一下:
echo custom_encrypt(1024, 5);
輸出結果是一個經過打包和編碼後的字符串,例如:
AAAAAAgAAZ8ZziUAbTY2AA==
加密後的數據我們也可以通過unpack()解回原始內容:
function custom_decrypt($encoded) {
$binaryData = base64_decode($encoded);
$data = unpack("NuserId/Ntimestamp/CactionType/a3checkCode", $binaryData);
return $data;
}
使用方法:
$encoded = custom_encrypt(2048, 3);
$decoded = custom_decrypt($encoded);
print_r($decoded);
輸出將是類似:
Array
(
[userId] => 2048
[timestamp] => 1716821234
[actionType] => 3
[checkCode] => m66
)
由於最終是base64 編碼的字符串,我們可以將其安全地附加在URL 中:
$url = "https://m66.net/api/receive.php?token=" . urlencode(custom_encrypt(2048, 1));
接收端解密方式也一樣:
$token = $_GET['token'];
$data = custom_decrypt($token);
pack()是PHP 中一個被忽視但非常強大的工具。它為我們提供了對底層二進制數據的精確控制。在某些需要輕量加密或數據封裝的場景中,將其與base64_encode()和unpack()配合使用,可以迅速構建起自定義加密傳輸邏輯。
當然,這種方式不適用於處理敏感信息,它更適合作為輕量的編碼/混淆方案,而非真正意義上的安全加密。如果你在處理用戶密碼、財務數據等場景,請選擇標準的加密算法如OpenSSL 或libsodium。
通過掌握pack()的多種格式化符號,你甚至可以模擬網絡協議的打包過程,在自定義API 設計中大有作為。