Вы (и @ gusto2) совершенно правильно используете магическое число: вы сразу получаете первые 6 байтов ключа, зная, что первые 6 байтов GIF89a .
Следуя спецификации gif , мы можем больше узнать о ключе.Вот несколько советов, где я нумерую байты вашего файла по индексу 0 (поэтому байты 0-5 соответствуют магическому числу):
Последний байт открытого текста GIFфайл 0x3B.Возможно, это даст вам еще один байт ключа (в зависимости от размера файла, например, если размер файла равен 7, 8 или 9 по модулю 10, то вы получите байт ключа)
После магического числа идет 7-байтовый дескриптор логического экрана.Первые 4 байта сообщают ширину и высоту: если бы вы знали ширину и высоту вашего gif-файла, то вы бы смогли извлечь оставшиеся 4 неизвестных байта ключа.Предположим, вы этого не знаете.
Байт 10 файла, который вы узнаете, поскольку он соответствует ключевому байту 0 в вашем шифровании XOR.Когда вы расшифровываете этот байт, самый важный бит - это флаг глобальной таблицы цветов.Если этот бит равен 0, то глобальная таблица цветов отсутствует - это означает, что следующий байт (байт 11) является либо блоком изображения (байт 0x2C), либо блоком расширения (0x21).Опять же, вы можете расшифровать этот байт (потому что он соответствует ключевому байту 1), чтобы вы точно знали, что это такое.
Изображения поступают в виде блоков, начиная с 0x2C и заканчивая 00.
Существует два подхода, которые вы можете использовать для расшифровки:
(1) Работа вручную, как я описал выше.Вы должны иметь возможность интерпретировать блоки и искать ожидаемые значения ключевых байтов 0x2c, 0x21, 0x00 и 0x3b.Оттуда вы можете выяснить, что имеет смысл быть следующим, и получить ключевые байты вручную;или
(2) Вы грубо форсируете последние 4 байта (2 ^ 32 возможных значения).Для каждого предположения вы расшифровываете изображение-кандидат gif, а затем подаете результат в анализатор gif ( пример синтаксического анализатора ), чтобы увидеть, будет ли оно отклонено или нет.Если это так, то вы знаете, что кандидат ошибается.Если этого не произойдет, то у вас есть возможность реального дешифрования и вы сохраните его.В конце вы просматриваете своих реальных кандидатов один за другим (вы не ожидаете много кандидатов), чтобы увидеть, какой из них является правильным дешифрованием.
EDIT: Вы сказали, чтоширина и высота - 640 и 960. Это означает, что байты 6 и 7 будут младшим порядковым представлением 640, а затем 960 в младшем байтовом порядке для байтов 8 и 9. Вы должны получить весь ключ из этого.Попробуйте и дайте нам знать, если это работает.Убедитесь, что вы правильно указали порядок байтов!