解密旧GPG文件时遇「gpg: no valid OpenPGP data found」错误,如何判断文件类型及创建工具?
解密旧GPG文件时遇「gpg: no valid OpenPGP data found」错误,如何判断文件类型及创建工具?
问题场景
我在尝试解密2009年10月在Linux机器上创建的文件,执行命令:
gpg -d mydata.tar.gpg
本该提示输入密码(我还记得密码),却出现错误:
gpg: no valid OpenPGP data found gpg: decrypt_message failed: eof
当前使用的是Ubuntu 10.04 LTS(Linux 2.6.32-64-Generic)上的gpg (GnuPG) 1.4.10。因为时隔太久,我已经忘了当初是用什么工具创建的这个文件,有没有办法判断它的创建工具和版本?
(执行file mydata.tar.gpg只返回:data)
更新:感谢@dave_thompson_085的评论,我确实发现可解密的.tar.gpg文件和这个无法解密的文件头部有差异:
- 可解密文件的开头都是
8c 0d 04 02 03 02- 有问题的文件开头是
b6 ef c2 36 b4 16
排查与解决思路
这个错误说明GnuPG完全识别不出文件里的OpenPGP格式数据,大概率是文件当初用的不是标准GPG加密,或者文件本身损坏、被修改过。结合你已经发现的头部差异,咱们可以从这些方向入手:
1. 深挖文件头部的特征信息
你对比头部的思路非常对,咱们可以用工具查看更多头部内容,再匹配常见加密工具的签名(magic numbers):
执行以下命令导出文件前32字节的十六进制内容:
xxd -l 32 mydata.tar.gpg
然后对照这些常见工具的特征:
- 标准OpenPGP加密文件的开头通常是
0x85(旧式)或者0xC0/0x8C(对应你能解密的文件开头8c) - 若用
openssl加密(比如openssl enc命令),常见开头是Salted__(十六进制53 61 6c 74 65 64 5f 5f) - 7-Zip加密归档的开头一般是
7z BC AF 27 1C ccrypt加密文件的开头是ccrypt(十六进制63 63 72 79 70 74)
2. 用常见加密工具逐一测试解密
既然GPG不认,咱们试试其他主流工具:
- OpenSSL测试:先试最常用的AES-256-CBC算法:
输入你记得的密码试试,报错的话换其他算法(比如openssl aes-256-cbc -d -in mydata.tar.gpg -out mydata.taraes-128-cbc、bf-cbc) - ccrypt测试:直接执行解密命令:
ccdecrypt mydata.tar.gpg - 7-Zip测试:如果是加密的7z归档,试试解压:
7z x mydata.tar.gpg - 归档格式测试:说不定文件名后缀标错了,试试直接解压为tar.gz:
tar xzf mydata.tar.gpg
3. 检查文件完整性与提取可读信息
文件可能在存储过程中损坏,或者残留工具标识:
- 用哈希工具验证完整性(如果当初保存过哈希值的话):
md5sum mydata.tar.gpg - 提取文件里的可读字符串,找工具痕迹:
比如openssl加密会残留strings mydata.tar.gpg | head -20Salted__,其他工具可能会有名称标识。
4. 结合2009年的工具环境回忆
2009年Linux常用的加密工具除了GPG,还有这些:
openssl:当时已经普及,很多人用它加密单个文件ccrypt:轻量级工具,操作简单mcrypt:老牌加密工具,支持多算法- 桌面环境自带的加密功能(比如Nautilus的加密压缩),这类可能用非标准GPG方式处理
你可以把问题文件的头部序列b6 ef c2 36 b4 16对应到这些工具的文档里搜索,大概率能匹配到具体工具。
备注:内容来源于stack exchange,提问作者ususer
相关产品推荐
相关产品推荐

