Я пытаюсь понять, как работает 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
У меня есть только варианты (для ясности в младшем порядке, первый бит — последний блок, два следующих бита — тип кодирования):
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 или д, е, ф. Некоторые из них использовали фиксированный словарь. Так возможно ли теоретически попробовать следующие байты? Другие байты являются динамическим словарем. Так возможно ли создать дерево Хаффмана со следующими байтами? Неправильный ключ, вероятно, приведет к невозможным деревьям Хаффмана. Когда у меня осталось немного возможностей, я мог попытаться использовать оставшиеся ключи.
8 и 9 могут быть легко проверены.
Ключ построен так:
MD5(pass[::-1])+MD5(pass[:len(pass)])
Таким образом, теоретически, ключ может быть от 32 до 50-60 символов, в зависимости от длины ключа.
Таким образом, можно было бы получить только первые биты и посмотреть, что
сжатый
№ 3-битный заголовок просто определяет, является ли он последним закодированным блоком или нет, и тип кодирования блока.
Я просто хочу знать, могу ли я сделать умный «брутфорс» для того, чтобы
воссоздать первые байты, которые могут полностью gzdeflate () файл
Навряд ли. Обычно большинство блоков попадают под тип кодирования 10 - compressed with dynamic Huffman codes
,
Так согласно RFC1951 — 3.2.3. Детали формата блока Вы будете застревать при чтении первого кода дерева кода Хаффмана. Если вы не можете декодировать это дерево, вы даже не будете знать, где заканчивается ваш первый блок, потому что вы, возможно, потеряли маркер конца блока.
Если целостность вашего файла не так важна, то есть, если это текст, XML, CSV или что-то еще, что вы выиграете от частичный восстановление файла — тогда вы можете добиться успеха этим алгоритмом:
Однако, поскольку в некоторых блоках могут быть обратные ссылки на предыдущие блоки (в том числе на ваши поврежденный и из-за этого убрали первый блок) — вам тоже может не повезло
Других решений пока нет …