gpg --symmetric(即gpg -c)采用AES-128/AES-256对称加密,无需密钥对,密码经PBKDF2派生,抗暴力破解强,生成标准OpenPGP格式文件,跨平台兼容性好,但需注意cipher-algo、output和密码输入方式以避免CI/CD脚本失败。

gpg --symmetric 就行,不需要密钥对,也不依赖他人公钥——这是对称加密最核心的优势。
为什么选 gpg --symmetric 而不是其他方式
它默认用 AES-128(GnuPG 2.2+ 默认升级为 AES-256),密码经 PBKDF2 密码派生,抗暴力破解能力远强于随手写个 openssl enc -aes-128-cbc 加盐不充分的调用。而且生成的 .gpg 文件自带标准 OpenPGP 包装,跨平台解密兼容性好(Windows/macOS 上的 GPG4Win / GPG Suite 都能直接打开)。
gpg -c 命令的实际用法和常见坑
最简命令是:
gpg -c document.txt
执行后会生成 document.txt.gpg,并交互式要求你输入两次密码。但这里有几个关键点必须注意:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 默认不加
--cipher-algo时,老版本 GnuPG(gpg -c --cipher-algo AES256 document.txt - 如果终端不支持密码隐藏(比如某些容器环境或重定向 stdin),会明文回显密码——此时务必加
--batch --passphrase-fd 0并从管道传入,而不是裸用--passphrase -
-c模式下,--output必须显式指定,否则输出会打到终端(乱码)或被丢弃;正确写法:gpg -c --output doc.gpg document.txt - 别用
echo "pwd" | gpg -c --passphrase-fd 0 file.txt——这会让密码留在 shell 历史里;应改用gpg --batch --passphrase-fd 0 --cipher-algo AES256 -c --output out.gpg file.txt 手动输,或用 <code>read -s临时变量封装
解密时怎么避免“no valid OpenPGP data found”错误
这个错误几乎全是因文件名或路径搞错导致的。解密命令本身极简单:
gpg -d document.txt.gpg > document.txt
但要注意:
- 输入文件必须是
.gpg(二进制格式)或.asc(ASCII armor 格式);若误把.gpg当文本编辑过,哪怕只多一个换行,gpg -d就会直接报该错 - 不要用
gpg --decrypt替代gpg -d——虽然等价,但部分旧脚本里--decrypt在非交互模式下行为不稳定 - 如果解密后内容为空,先检查是否漏了重定向
>;gpg -d file.gpg默认输出到 stdout,不重定向就只是刷屏 - 密码输错三次后,GPG 会静默退出且返回码为 2,脚本中需用
$?判断,不能只看输出
--cipher-algo、--output、密码输入方式这三点,错一个就卡住半天。尤其在 CI/CD 环境里,别图省事硬编码密码,也别信“我本地能跑就行”。

















