在开发中,很多时候我们会用到加密算法对数据进行处理。而在 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 设计中大有作为。