我试图了解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个字符,具体取决于密钥的长度。
答案 0 :(得分:0)
因此,有可能只获得前几位,然后看什么 压缩
不。 3位标头仅定义它是否是最后一个编码的块以及该块的编码类型。
我只想知道我是否可以按顺序进行智能“ bruteforce”操作 重新创建可以完全gzdeflate()文件的第一个字节
不太可能。通常,大多数块都属于10 - compressed with dynamic Huffman codes
编码类型。
因此,根据RFC1951 - 3.2.3. Details of block format,您将被困在阅读第一块霍夫曼代码树上。如果您无法解码该树,您甚至都不知道第一个块的结尾,因为您可能丢失了块结束标记。
如果文件完整性不是很重要,即是文本,XML,csv还是可以从部分文件恢复中受益的文件-那么,通过这种方法您可能会成功:
但是,由于在某些区块中可能存在对先前区块的反向引用(包括对您的损坏的引用,并且由于该第一区块已被删除)-您也可能不走运