
php 的 gnupg 扩展本身不提供直接设置压缩算法(如 zip)的参数接口,需通过配置 gpg 环境级配置文件 `gpg.conf` 实现压缩行为控制。
在使用 PHP 的 gnupg 扩展进行 PGP 加密时(例如调用 gnupg_encrypt()),开发者常希望控制底层 GPG 的压缩行为——尤其是启用 ZIP 压缩(--compress-algo 1,即 ZIP 算法),以减小密文体积并提升传输效率。但需明确:PHP 的 GnuPG 扩展(ext/gnupg)并未暴露 compress-algo、--compress-level 或类似选项的运行时 API;所有加密/解密行为均由底层 gpg 二进制程序驱动,其行为由 GPG 配置文件统一管控。
✅ 正确做法是:通过配置 GPG 的全局或用户级配置文件 gpg.conf,显式指定压缩算法与级别。
✅ 步骤详解
-
确认 GNUPGHOME 路径并创建配置文件
确保 PHP 进程可访问且有写入权限:putenv('GNUPGHOME=/var/www/.gnupg'); // 确保目录存在且权限正确(如 www-data 可读写) if (!is_dir('/var/www/.gnupg')) { mkdir('/var/www/.gnupg', 0700, true); } -
创建 /var/www/.gnupg/gpg.conf
写入以下内容(推荐启用 ZIP 压缩并设为默认):# 启用压缩(默认开启,但显式声明更可靠) compress-algo 1 # 1 = ZIP, 2 = ZLIB, 3 = BZIP2 # 可选:设置压缩级别(1~9,默认6) # compress-level 6 # 强制对所有输出应用压缩(即使明文很短) # no-encrypt-to # (其他常用配置可参考:https://github.com/drduh/config/blob/master/gpg.conf)
⚠️ 注意:compress-algo 1 是 ZIP 算法的标准标识符;GPG 会自动在加密前对明文执行 ZIP 压缩(符合 OpenPGP 标准 RFC 4880)。
-
验证配置是否生效
加密后,用命令行工具检查数据包结构:gpg --list-packets -vv --show-session-key encrypted.gpg
若输出中包含类似 compressed data packet: algo=1 的行,则表明 ZIP 压缩已成功应用。
? 关键注意事项
- PHP 扩展无运行时压缩控制:gnupg_addencryptkey()、gnupg_encrypt() 等函数不接受 compress-algo 参数,任何尝试通过 $res 设置该选项的操作均无效。
- 配置文件路径必须精确匹配 GNUPGHOME:gpg.conf 必须位于 GNUPGHOME 指向目录下,且文件名不能是 gpg.conf.bak 或带扩展名错误。
- 权限安全:.gnupg 目录权限应为 0700,gpg.conf 为 0600,避免私钥和配置泄露。
- 兼容性提示:旧版 GPG(
✅ 示例:完整加密流程(含压缩验证)
putenv('GNUPGHOME=/var/www/.gnupg');
$res = gnupg_init();
gnupg_seterrormode($res, GNUPG_ERROR_EXCEPTION);
// 导入公钥并加密
$pubkey = file_get_contents('/path/to/public.key');
$import = gnupg_import($res, $pubkey);
gnupg_addencryptkey($res, $import['fingerprint']);
$encrypted = gnupg_encrypt($res, "Hello, ZIP-compressed world!");
file_put_contents('msg.asc', $encrypted);
// 后续可用 gpg --list-packets -vv msg.asc 验证压缩包通过合理配置 gpg.conf,你无需修改 PHP 代码即可稳定启用 ZIP 压缩,既符合 OpenPGP 规范,又兼顾性能与兼容性。
立即学习“PHP免费学习笔记(深入)”;











