0

我试图了解 php gzdeflate/gzinflate 是如何工作的。如果我理解它是一个带有三位标头的简单比特流。因此,有可能只获取第一位并查看压缩的内容。因此,通过获取第一位,我们理论上可以(?)在字节之后提取字节?

事实上,我丢失了文件的一些位(大约前 40-50 个字节,有一些丢失的位,不是所有位,只是其中一些位)。我只想知道我是否可以执行智能“蛮力”以重新创建可以完全 gzdeflate() 文件的第一个字节。我知道它是 php 代码,所以提取的字节应该只是 ASCII。我试图暴力破解所有位,但它太长了。因此,如果我可以逐位强制执行,那将是可取的。

(如果在python中有一个可读的重新实现,那将对我有很大帮助)。我已经阅读了http://www.zlib.net/feldspar.html更多关于如何压缩数据的内容,我想解压缩它。

谢谢

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

39e0 6fb2 41eb ....

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

算法是这个:

(ciphered - key) % 256 = deflate_data

密钥为十六进制形式。所以第一个字节密钥只能是:0x30 -> 0x39 和 0x61 -> 0x66 我只有选择(为了清楚起见,在 little endian 中,第一位是最后一个块,接下来的两个位是编码类型):

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 个字符,具体取决于密钥的长度。

4

1 回答 1

0

因此,有可能只获取第一位并查看压缩的内容

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

我只想知道我是否可以执行智能“蛮力”以重新创建可以完全 gzdeflate() 文件的第一个字节

不太可能。通常大多数块都属于编码类型10 - compressed with dynamic Huffman codes。所以根据RFC1951 - 3.2.3。块格式的详细信息,您将被困在阅读第一个块 Huffman 代码树时。如果你不能解码这棵树,你甚至不知道你的第一个块在哪里结束,因为你可能丢失了你的块结束标记。

你可以尝试什么

如果您的文件完整性不是那么重要,即如果它是文本、XML、csv 或您将从部分文件恢复中受益的东西 - 那么您可能会通过这个算法成功:

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

但是,因为在某些块中可能存在对先前块的反向引用(包括对您损坏的以及由于删除的第一个块)-您也可能不走运

于 2019-02-11T13:04:18.083 回答