我想了解PHP gzdeflate / gzinflate作品。如果我知道这是一个三个有点简单的比特流。因此,有可能只拿到了第一位,看看被压缩。因此,通过采取第一位,我们可以在理论上(?)中提取字节后的字节?
事实上,我已经失去了文件的某些位(围绕第一字节40-50与一些失位,并非所有的位,只是其中的一部分)。我只是想知道如果我能以重建第一字节能充分gzdeflate()的文件做一个聪明的“暴力破解”。我知道这是PHP代码,所以提取的字节数应该只有ASCII。我尝试猜解所有位,但它是太长了。所以,如果我能位之后暴力破解位,这将是可取的。
(如果在Python重新实施,是可读的,这将帮助我很多)。我读过http://www.zlib.net/feldspar.html它更多关于如何对数据进行压缩,我想解压缩。
谢谢
编辑:让我们看一个例子。这是我的数据(十六进制):
39e0 6fb2 41eb ....
这个数据是从关键扣除。此键在其十六进制格式使用,所以我只有16对每个字符的可能性。
ALGO是这个:
(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。他们中的一些使用固定的字典。因此,它是theorically可以尝试下个字节?其它字节是动态的字典。那么,有可能创造旁边字节的霍夫曼树?错键可能会产生无法哈夫曼树。当我走了几种可能性,我可以尝试猜解其余按键。
图8和9可以很容易地进行测试。
关键是构建这样的:
MD5(pass[::-1])+MD5(pass[:len(pass)])
所以,theorically,密钥可以是32至50-60个字符,这取决于密钥的长度。
因此,有可能只得到了第一位,看看被压缩
第3号位头只是限定,如果它是最后的编码块或不与块的编码类型。
我只是想知道如果我能以重建第一字节能充分gzdeflate()的文件做一个聪明的“暴力破解”
不太可能。通常大多数块将归入编码类型10 - compressed with dynamic Huffman codes
。因此,根据RFC1951 - 3.2.3. Details of block format你会读第一块Huffman编码树卡住。如果你不能解码这棵树,你甚至不会知道你的第一个块结束,因为你可能已经失去了你的最终块的标志物。
如果你的文件的完整性并不那么重要,即如果它是文本,XML,CSV或东西在那里你会从部分文件恢复中受益 - 那么你可以通过这个算法中取得成功:
然而,由于一些块有可能是先前块反向引用(包括对您的损坏,并因为移除的第一个块) - 你可能是出于运气太