У меня есть 100 байт.
Вот они:
65 5A 44 5B 58 44 43 8A 4B 5A 4A 5B 41 4F 58 8A 42 4D 8A 40 4A 46 47 55 84
8A 68 8A 47 4F 45 5A 42 58 55 4D 4A 58 4F 41 56 47 51 5F 8A 40 8A 46 44 4E
4F 8A 45 44 5B 4F 41 4F 47 42 55 5F 8A 46 44 4C 4F 58 8A 5B 41 59 4C 42 58
56 8A 48 8A 40 4A 5D 4F 5B 58 48 4F 8A 59 40 5A 4A 52 4F 47 42 55 84 A7 A0
Теперь они и у вас есть.
В них написан какой-то осмысленный текст. Предположительно русский (выдернуто из игры). Байты как я понял перевернуты. Что это за кодировка такая, что там написано и, чёрт возьми, кто тот герой, что сможет объяснить как их правильно конвертнуть в этом случае?
Ответ
Браслет из камня. В непритязательных к моде поселениях может служить в качестве украшения.
Вы были абсолютно правы, текст, явно из игры :)
Шифр элементарный. С каждый байтом строки в кодировке windows (1251) произведен XOR с 0xAA
Догадаться было не сложно, по частоте символов мы определили, что чаще всего встречается 8A, предположили, что это пробел. Далее я обратил внимание, что это практически единственный байт, который больше 0x80, остальные байты гораздо меньше. А как известно, у пробела самый маленький код 0x20, латинские символы начинаются с 0x41, а русские так вообще во второй половине таблицы, после 0x80. Получается все крупные числа превратились в мелкие, а маленькое число наоборот в большое - это явный признак операции XOR, тем более она обычно и используется в криптографии т.к. легко обратима, повторением операции. 0x8A xor 0x20 = 0xAA - вот наш ключ. Сделал маленькую прогу, которая считала ваши шестнадцеричиные коды символов, сделала из них числа и провела xor 0xAA. Текст перед нами.
На perl моя программа выглядела так:
#!/usr/bin/perl
$a=<>; // Читаем строку из входного файла
@b=split(/ /,$a); // Делаем массив hex кодов, они через проблел
foreach $a (@b) // бежим по массиву
{
$n=hex($a) ^ 0xAA; // Делаем нормальное число из шестнадцетиричного и XOR 0xAA
print(chr($n)); // Печатаем символ с этим кодом
}
Комментариев нет:
Отправить комментарий