【问题标题】:decompressing IMAP deflated message解压 IMAP 压缩消息
【发布时间】:2017-03-02 04:46:48
【问题描述】:

我在尝试解压缩使用 deflate 方法压缩的 imap 消息时遇到问题。到目前为止,我尝试过的事情是隔离 IMAP 对话的方向之一(使用 wireshark 的 follow tcp 功能)并将消息数据保存为原始格式,我希望它只包含压缩的消息部分。然后我找到了一些程序,如 tinf(第 1 和第 3 个示例)和 miniz(tgunzip 示例),并尝试恢复该文件,但没有成功。 我错过了什么?提前谢谢你。

tinf - http://www.ibsensoftware.com/download.html Miniz - https://code.google.com/archive/p/miniz/source/default/source

【问题讨论】:

  • IMAP 压缩完整的流,而不仅仅是消息,因此您不能将消息从其上下文中删除。该消息取决于较早的字节。在 CRLF 之后,您必须从服务器对 COMPRESS DEFLATE 命令说 OK 的位置开始放气。 Tinf 看起来应该解压缩,如果你得到正确的剪切和粘贴。
  • 不幸的是它不起作用。仍然让 inflate() 失败,状态为 -3
  • 注意剪切和粘贴。

标签: compression imap deflate inflate


【解决方案1】:

尝试将原始数据传输到:

perl -MCompress::Zlib -pe 'BEGIN{$i = inflateInit(-WindowBits => -15)}
                           $_=$i->inflate($_)'

重要的部分是-WindowBits => -15,它将预期格式更改为原始格式,没有阿德勒校验和。

(源自 dovecot 源,适用于 Thunderbird 到 gmail 网络捕获)。

来自指定 IMAP 压缩的RFC4978(重点是我的):

使用 zlib 库时(请参阅RFC1951),函数 deflateInit2()、deflate()、inflateInit2() 和 inflate() 足以 实现这个扩展。 windowBits 值必须在范围内 -8 到 -15,否则 deflateInit2() 使用错误的格式。 deflateParams() 可用于提高压缩率和资源 采用。 deflate() 的 Z_FULL_FLUSH 参数可用于清除 字典(接收节点不需要做任何事情)。

【讨论】: