【问题标题】:mdc error when decrypting GPG message解密 GPG 消息时出现 mdc 错误
【发布时间】:2026-01-11 05:55:02
【问题描述】:

我有一个客户端和服务器系统,它定期运行计划任务并通过已被 gpg 加密的 xml 文件进行通信。所有必需的公钥已在客户端和服务器之间成功交换。加密和解密调用是从一个批处理文件完成的。

加密语法

gpg.exe --batch --yes --recipient %1 --output %4 --passphrase %5 --local-user %2 --sign --encrypt %3

解密语法

gpg.exe --batch --yes --output %3 --passphrase %4 --decrypt %2 2>%1

客户端创建一个xml文件,使用gpg使用服务器公钥对其进行加密,使用私钥签名并将其上传到服务器的ftp站点。服务器定期检查 ftp 文件夹中的新文件。对于任何新文件,它使用 gpg 解密,然后处理文件中的 xml。

对于服务器尝试解密的一些xml文件,我收到如下错误:

gpg: block_filter 00AA8400: 读取错误 (size=7841,a->size=395)

gpg: mdc_packet 编码无效

gpg:解密失败:无效数据包

gpg: block_filter: 待处理字节!

需要注意的是,并非所有文件都发生这种情况,而只有部分文件会发生这种情况。我无法找到失败的文件之间的任何共性。

有人熟悉这个错误的含义吗?欢迎提出任何有助于追踪此问题的建议。

【问题讨论】:

    标签: security encryption gnupg mdc


    【解决方案1】:

    终于明白了。 gpg 不是这里的罪魁祸首。当服务器检查指定文件夹中的文件时,它使用 Delphi 上的 Append(fileHandler) 方法来测试文件是否可以打开。但是这种方法有一个特殊的条件,就好像它在文件的最后 128 字节块中找到了 ascii 字符 26(即 CTRL+z),它会删除该字符中的所有内容,直到文件末尾。这导致部分加密文件被删除,随后在通过 gpg 解密时导致上述错误。将 Append 方法替换为 Reset(fileHandler) 后,加密文件不再被修改,解密完美。

    【讨论】: