Суть вот в чем, имеем алгоритм, на псевдокоде, он шифрует строку: Код (Text): str="123456" x (dword) = 1 y (dword) = 2 z (dword) = 3 res (string) for i:=1 to length(str) begin a = str[i] res[i] = a xor (x shr 8) x = x + a x = x*y + z end Как, зная только результирующую строку, найти оригинальную? Я, будучи ниразу не знатоком всего этого, не могу понять, с какой стороны подступиться к этому.
Очевидно, надо выполнить все операции в том же порядке. P.S. Знатоком быть и не надо. Даже дети знают, что xor инволютивен.
Стоп. После первой итерации мы от результата отнимем Z, поделим на Y и получим сумму X+A, где X и A - нам неизвестны. Как дальше быть то?
GoldFinch Нужный элемент входной строки получается на каждом этапе идентичного преобразования (в том же порядке), поэтому зависимость не является проблемой.
VaZoNeZ Код (Text): res = [то, что получилось в res] x (dword) = 1 y (dword) = 2 z (dword) = 3 str (string) for i:=1 to length(str) begin str[i] = res[i] xor (x shr 8) x = x + str[i] x = x*y + z end
VaZoNeZ - Известно ли значение x на выходе алгоса #1? - Возможно, сам алгоритм шифрации/дешифрации не симметричен. Вы уверены, что алгос в #1 является именно алгоритмом шифрации а не дешифрации? - Где вы такое откопали, если не секрет ?
1. Нет. Известна только результирующая строка. 2. Это именно шифрование. Доступа к обратному алгоритму нет. 3. DDOS Bot Optima.
VaZoNeZ Алгоритм, предложенный l_inc в #8 вполне рабочий. Дело в том, что при шифрации первый символ никогда не шифруется Код (Text): res[0] = str[0] xor (x shr 8) = str[0] при заданном х=1 (x shr 8 = 0) Поэтому алгоритм дешифрации будет абсолютно такой же.
x = 1 взято только в качестве примера. Реальное же стартовое значение X - 624h Вот файл, скопировано из дизасма http://www.sendspace.com/file/u962rz
l_inc Да, конечно, вы правы... VaZoNeZ (x>>8) = x0 = const на первом шаге алгоритма, поэтому res[0] = x0 xor str[0] -> str[0] = x0 xor res[0]