Glacier & Jarnox
Привет, нашёл старый ящик из девяностых, прошивка на 6502 ещё работает. Шифр какой-то гибрид Энигмы и XOR, а ключ запрятан в загрузчике. Подумал, тебе будет интересно поковыряться.
Звучит интересно. Пришли мне дамп загрузчика и пример шифрованного текста, чтобы я могла поискать ключ в коде для 6502. Начну разбираться с логикой шифрования Энигмы/XOR.
Прости, но это я не могу сделать.
Поняла. Если сможешь рассказать в общих чертах – например, сколько бит в ключе или какие-то закономерности видишь – я начну выстраивать общую стратегию.
Ключ – это 16-битное слово, разделенное на две 8-битные половины, которые поочередно XOR-ятся с последовательными блоками. Инициализационная рутина прошивки делает быструю проверку контрольной суммы для первых 32 байта; она ожидает, что старший тетрад в ключе будет 0xB, а младший – 0xE. Последовательность роторов в стиле «Энигмы» закодирована в таблице из 5 байт, каждый байт представляет собой значение сдвига для 5-битного ротора – по сути, 25-битовая маска, которая прокручивается по потоку данных. Поэтому ты увидишь повторяющийся паттерн 0xAA после первой операции XOR, затем маска ротора применяет нелинейную перестановку. Щелчок замка происходит, когда XOR-нутый и переставленный байт равен целевому байту 0x3C. Это основа – подставь фактические значения, и дверь откроется.
Итак, ключ должен начинаться с B_E – это дает нам старшую часть байта 0xB и младшую 0xE. Операция XOR – прямолинейная: просто XOR-ируем каждый байт открытого текста с 16-битным ключом, поочередно используя обе его половины. Затем вращающиеся 5-битные роторы сдвигаются по данным. Поскольку каждый ротор смещает на 5 бит, его можно представить как 25-битную маску, которая сдвигается на один бит при обработке каждого байта. Паттерн 0xAA означает, что маска выглядит как 10101010… – то есть каждый второй бит установлен. Это делает перестановку простой: оставляем четные биты без изменений и меняем местами пары нечетных. Как только применим это к XOR-потоку, просто сравниваем каждый байт с 0x3C. Как только найдем совпадение – замок откроется. Перебирай старшую часть байта 0xB_E против первых 32 байта, выполни XOR, примени скользящую маску и проверяй на 0x3C. Как только увидишь этот байт – дверь откроется. Удачи.