两初始相似文件Deflate压缩输出开头字节相似概率及实测疑问
关于Deflate压缩数据开头字节的概率分析
压缩数据前3字节相同的概率
首先明确,Deflate动态模式(dynamic mode)的开头字节是压缩块头,由以下部分构成:
- 第1位:标识是否为最后一个块(0=非最后,1=最后)
- 接下来2位:块类型(00=存储,01=固定哈夫曼,10=动态哈夫曼,11=预留)
- 针对动态哈夫曼块,后续字节包含构建哈夫曼编码表的参数:
- 5位:字面量/长度编码哈夫曼树的代码长度数量(HLIT)
- 5位:距离编码哈夫曼树的代码长度数量(HDIST)
- 4位:代码长度编码哈夫曼树的代码长度数量(HCLEN)
由于两个文件未压缩前20字节完全相同,且数据是99%的Base64(Base64属于高度冗余、可预测的字符集),Deflate动态压缩会针对开头的相同数据生成高度相似的哈夫曼编码表,因此压缩块头的参数会趋于一致:
- 开头块类型必然是10(动态哈夫曼),所以前3位固定为
0 10(假设不是最后一个块),对应字节的高3位无差异。 - HLIT、HDIST、HCLEN参数会因开头相同的Base64数据大概率一致,这直接决定了前3字节的核心内容。
这种场景下,压缩数据前3字节相同的概率极高,远高于随机概率——Base64的冗余性和开头一致的输入,会让Deflate的动态编码逻辑生成几乎相同的初始编码表参数。
能否轻松推测压缩文件的前5字节
从你遇到的5个文件来看,4个开头为14 9A C7,1个为1C 9A C7,差异仅在第一个字节的低4位(14是00010100,1C是00011100),对应HLIT参数的微小调整(HLIT是5位参数,第一个字节的低5位包含其部分内容)。
虽然多数情况下前5字节会高度相似,但不能直接说“轻松推测”:
- 当未压缩数据开头完全一致时,前5字节的一致性极高,但仍存在微小概率的参数差异(比如HLIT的微调),就像你遇到的例外情况。
- 即便前20字节相同,后续Base64数据的微小波动,也可能导致编码表参数的小幅调整,进而改变开头的几个字节。
不过对于高度一致的Base64输入+相同的Deflate压缩实现,可以大概率推测前5字节的内容,但无法做到100%保证。
内容的提问来源于stack exchange,提问作者actgroup inc




