背景服务器上用 GPG 加密了一个备份包密码存在 /root/.backup_pass。想在 Windows 上验证能不能解密结果gpg --passphrase-file backup_pass.txt --decrypt secrets.tar.gz.gpg # gpg: decryption failed: Bad session key密码是从服务器抄过来的一个字符没差。原因用显微镜看两个文件的字节服务器端Linuxxxd /root/.backup_pass | tail -2 # ... 3D 0A ← 结尾是 换行(LF)Windows 端Format-Hex backup_pass.txt # ... 3D 0D 0A ← 结尾是 回车 换行(CRLF)多了一个 0D回车。Windows 的 Set-Content 默认在每行末尾加 \r\nGPG 把那个 \r 也当成密码的一部分了。解决用不自动加 CRLF 的写入方式# ❌ 会加 CRLF PASSWORD | Set-Content backup_pass.txt # ✅ 一字不差 [System.IO.File]::WriteAllText($HOME\backup_pass.txt, PASSWORD)Linux 端写密码文件时也养成习惯# ❌ echo 会自动加 \nechoPASSWORD/root/.backup_pass# ✅ -n 不加换行echo-nPASSWORD/root/.backup_pass验证效果Format-Hex backup_pass.txt # 结尾应该只有 3D没有 0D 0A再解密gpg --passphrase-file backup_pass.txt --decrypt secrets.tar.gz.gpg # gpg: AES256.CFB encrypted data # gpg: encrypted with 1 passphrase # → 成功三个坑坑 1肉眼看不出的差异记事本里两个文件长得一模一样只有看字节才知道差一个 \r。跨平台处理密钥文件永远用 Format-Hex / xxd 确认。坑 2Linux 的 echo 也会加换行不只是 Windows 有坑。Linux 写密码文件记得用 echo -n。坑 3密码管理器里存的值可能带换行从密码管理器复制时有的会带上末尾换行。写入文件后记得清一下。