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