(PHP)放气数据头中缺少一些位

时间:2019-02-11 11:08:18

标签: php deflate

我试图了解php gzdeflate / gzinflate的工作原理。 如果我了解这是带有三位标头的简单位流。因此,将可能仅获得前几位并查看压缩的内容。因此,通过采用第一位,理论上我们可以(?)提取字节之后的字节?

事实上,我已经丢失了文件的某些位(在前40-50个字节中丢失了一些位,而不是所有位,只是其中一些)。我只想知道我是否可以执行智能的“ bruteforce”以重新创建可以完全gzdeflate()文件的第一个字节。我知道这是php代码,因此提取的字节应仅为ASCII。 我试图强行使用所有工具,但是时间太长了。因此,如果我可以一点一点地强行使用,那将是更好的选择。

(如果有可读性的python重新实现,那对我有很大帮助)。我已经读过http://www.zlib.net/feldspar.html,该书更多关于如何压缩数据,我想将其解压缩。

谢谢

编辑: 让我们举个例子。这是我的数据(十六进制):

39e0 6fb2 41eb ....

此数据是从键中减去的。该密钥以其十六进制格式使用,因此每个字符只有16种可能。

算法是这个:

(ciphered - key) % 256 = deflate_data

密钥为十六进制形式。因此,第一个字节密钥只能是:0x30-> 0x39和0x61-> 0x66 我只有选择(为了清楚起见,在小尾数法中,第一位是最后一块,第二位是编码类型):

Key -> deflate
0 -> 10010000  --> No, if .00 code, all other bits must be 00
1 -> 00010000  --> No, if .00 code, all other bits must be 00
2 -> 11100000  --> No, .11 is reserved
3 -> 01100000  --> No, .11 is reserved
4 -> 10100000  --> Maybe?
5 -> 00100000  --> Maybe?
6 -> 11000000  --> Maybe?
7 -> 01000000  --> Maybe?
8 -> 10000000  --> Uncompressed? Must check LEN and NLEN
9 -> 00000000  --> Uncompressed? Must check LEN and NLEN
a -> 00011011  --> No, .00 should hav all others bits to 0
b -> 11101011  --> No, .11 is reserved
c -> 01101011  --> No, .11 is reserved
d -> 10101011  --> Maybe?
e -> 00101011  --> Maybe?
f -> 11001011  --> Maybe?

所以我密钥的第一个字节可能是: 4,5,6,7或d,e,f。其中一些使用固定字典。因此,理论上可以尝试下一个字节吗?其他字节是动态字典。那么有可能用下一个字节创建一个霍夫曼树吗?错误的密钥可能会产生不可能的霍夫曼树。当我几乎没有其他可能性时,我可以尝试暴力破解剩余的密钥。

8和9可以轻松测试。

密钥的构造如下:

MD5(pass[::-1])+MD5(pass[:len(pass)])

因此,理论上,密钥可以为32到50至60个字符,具体取决于密钥的长度。

1 个答案:

答案 0 :(得分:0)

  

因此,有可能只获得前几位,然后看什么   压缩

不。 3位标头仅定义它是否是最后一个编码的块以及该块的编码类型。

  

我只想知道我是否可以按顺序进行智能“ bruteforce”操作   重新创建可以完全gzdeflate()文件的第一个字节

不太可能。通常,大多数块都属于10 - compressed with dynamic Huffman codes编码类型。 因此,根据RFC1951 - 3.2.3. Details of block format,您将被困在阅读第一块霍夫曼代码树上。如果您无法解码该树,您甚至都不知道第一个块的结尾,因为您可能丢失了块结束标记。

您可以尝试的方式

如果文件完整性不是很重要,即是文本,XML,csv还是可以从部分文件恢复中受益的文件-那么,通过这种方法您可能会成功:

  1. 选择下一个暴力破解块长度
  2. 从输入流的开头删除block_length个字节
  3. 将生成的流传递到gzinflate()
  4. 如果成功-您有未压缩的数据(第一个块除外), 否则-重复所有步骤

但是,由于在某些区块中可能存在对先前区块的反向引用(包括对您的损坏的引用,并且由于该第一区块已被删除)-您也可能不走运