Kaelorn & Diglore
Kaelorn Kaelorn
Я тут наткнулся на фрагмент старого зашифрованного журнала с пропавшего узла. Код какой-то… странный, больше похож на ритуал, чем на алгоритм. Поможешь разобраться вместе?
Diglore Diglore
Конечно, будем относиться к этому как к бесценной находке. Сначала положим его перед собой и посмотрим, есть ли повторяющиеся символы или закономерности. Потом сделаем быстрый анализ частоты и начнем проверять версии. Как он выглядит?
Kaelorn Kaelorn
Я вытащил фрагмент из хранилища, дата которого 2019-03-07. Это строка из 48 байт в шестнадцатеричном коде. Последовательность повторяется ровно четыре раза: 4D 9E 2A 7C 4D 9E 2A 7C 4D 9E 2A 7C. Похоже на зацикленный ключ или контрольную сумму. Если перевести эти шестнадцатеричные байты в ASCII, получается "Mж*|Mж*|Mж*|Mж*|". Видно, что шифр повреждён. Повторение – наш первый зацепку. Давай посмотрим, что покажет частота каждой тетрады.
Diglore Diglore
Кажется, каждый ниббл в этом 48-байтном блоке встречается ровно четыре раза: 4, D, 9, E, 2, A, 7, C. Блок просто повторяется из четырехбайтного шаблона 4D9E2A7C, поэтому, скорее всего, у нас очень короткий и периодичный "ключ" или контрольная сумма. Обычно это указывает на простое XOR или LFSR, а не на настоящий криптографический хеш. Следующий логичный шаг – рассматривать эту четырехбайтную последовательность как ключ и выполнить XOR с полученным ASCII – Mž*| – посмотрим, что получится. Если ничего внятного не выйдет, попробуем небольшую перестановку или сложение побайтно. Тот факт, что нибблы встречаются с одинаковой частотой, говорит о том, что ничего не перемешивалось, поэтому исходный шаблон, вероятно, и есть отправная точка. Давай попробуем XOR и посмотрим, получится ли что-то читаемое.
Kaelorn Kaelorn
Ты права, ключ – это его собственное отражение. Если применить XOR к Mž*| (0x4D 0x9E 0x2A 0x7C) с 4D 9E 2A 7C, то байты обнуляются, и получается сплошные нули. Это в тупик ведет. Может, стоит сдвинуть ключ на ниббл или добавить константу перед XOR. Или, может быть, рассматривать ключ как затравку для двухбайтного LFSR и пропускать его через небольшой PRNG, чтобы получить поток ключей. Давай попробуем циклический сдвиг влево на один байт: 9E 2A 7C 4D, XOR-им это с тем же блоком, посмотрим, что получится. Если результат все равно ерунда, попробуем добавить 0x55 к каждому байту перед XOR. Шаблон упрямый, но следующий трюк может и прояснить, что там скрыто.
Diglore Diglore
Good call on rotating; that’s a classic trick. The left‑rotate gives 9E 2A 7C 4D, which when XORed with the original 4D 9E 2A 7C produces the sequence 71 C7 54 70 – still not readable. The add‑0x55 idea will shift the range, but if the key is truly a LFSR seed, we should generate a longer keystream first. Let’s run a 4‑bit LFSR with tap positions that produce a 12‑byte cycle, then XOR that 12‑byte stream against the 48‑byte payload. The repetition in the key might be the PRNG’s period; aligning the phases could expose the underlying plaintext. Give that a shot and let me know the output.