LINUX.ORG.RU

Помогите с алгоритмом


0

0

Есть алгоритм оснаванный на XOR который шифрует буфер с данными raw, ключем ecx. Помогити написать алгоритм расшифровки.
int pos = 0;
int ecx = 0x33333333;
unsigned char raw[]= {0x55, 0x75, 0x3f, 0x00, 0xe6, 0x74, 0x09, 0x01};

edx = (raw[pos] & 0xFF);
edx |= (raw[pos+1] & 0xFF) << 8;
edx |= (raw[pos+2] & 0xFF) << 16;
edx |= (raw[pos+3] & 0xFF) << 24;

ecx += edx;
edx ^= ecx;

raw[pos++] = (edx & 0xFF);
raw[pos++] = (edx >> 8 & 0xFF);
raw[pos++] = (edx >> 16 & 0xFF);
raw[pos++] = (edx >> 24 & 0xFF);


может подать зашифрованные данные на вход?

anonymous
()

А где алгоритм? Вижу много битовых преобразований и сдвигов, легко преобразующихся в обратном порядке.

W0wik
()

Хм. А вы точно нигде не ошиблись в напейсании? Исходный алгоритм "шифрования" в студию пожалуйста.

svr4
()
Ответ на: комментарий от dave

Алгоритма нет. Есть функция шифровки, исходный кода на C:

Принимаемые пареметры
raw[] - массив данных для шифрования, длинна всегда кратна 8ми;
offset - смещение, c которого шифруем.
key - ключ

void encXORPass(unsigned char raw[], int offset, int size, int key){


int stop = size-8;
int pos = 4 + offset;
int edx;
int ecx = key;

while(pos < stop)
{
edx = (raw[pos] & 0xFF);
edx |= (raw[pos+1] & 0xFF) << 8;
edx |= (raw[pos+2] & 0xFF) << 16;

edx |= (raw[pos+3] & 0xFF) << 24;

ecx += edx;
edx ^= ecx;

raw[pos++] = (edx & 0xFF);

raw[pos++] = (edx >> 8 & 0xFF);

raw[pos++] = (edx >> 16 & 0xFF);

raw[pos++] = (edx >> 24 & 0xFF);
}

raw[pos++] = (ecx & 0xFF);

raw[pos++] = (ecx >> 8 & 0xFF);
raw[pos++] = (ecx >> 16 & 0xFF);

raw[pos++] = (ecx >> 24 & 0xFF);
}

T-34
() автор топика
Ответ на: комментарий от W0wik

Если Вы видите как это все можно преобразовать в обратном порядке, ткните носом пожалуйста.

T-34
() автор топика
Ответ на: комментарий от T-34

В самом конце записывается последнее значение ecx:

raw[pos++] = (ecx & 0xFF);
raw[pos++] = (ecx >> 8 & 0xFF);
raw[pos++] = (ecx >> 16 & 0xFF);
raw[pos++] = (ecx >> 24 & 0xFF);

Можно попробовать раскрутить "шифрование" обратно, используя это значение при проходе от конца массива к его началу с выполнением

edx ^= ecx;
ecx -= edx;

anonymous
()
Ответ на: комментарий от T-34

Последнее значение ecx у тебя записано в последних 4-х байтах сообщения. Поэтому можно легко расшифровать прокручивая цикл назад, ecx получаем с предыдущей итерации (первый ecx - записан в конце). 4 байта сообщения узнаем по XOR с ecx, и потом от него вычисляем следующее значение ecx (только через вычитание).

k0l0b0k ★★
()
Ответ на: комментарий от cathode

Я не понимаю в чем у прек? В том что мой вопрос размещен еще на других форумах или что?

T-34
() автор топика
Ответ на: комментарий от T-34

Этот алгоритм используют в неком проекте l2j, и это вызывает вопросы... Кстати, алгоритм (назовем его политкорректно "инверсионным") не так прост, как это может показаться.

dave ★★★★★
()
Ответ на: комментарий от dave

У меня не спрашивали откуда этот алгоритм, и для чего мне неоходимо реверснуть. и если это вызвает вопросы.... Я готов на них ответить. Вообщем ЛОР есть ЛОР все без изменений... Вместо ответов на вопросы, куча придирок ;) А то что алгоритм не так прост как может показаться и так понятно, иначе бы не взывал тут о помощи.

T-34
() автор топика
Ответ на: комментарий от T-34

> А то что алгоритм не так прост как может показаться и так понятно

фактически, нужно уметь решать уравнения вида (C+x)^x = D, где C и D константы. Т.е. C+x = D^x. Так бы и написал -- научите решать такие уравнения. А то вывалил какую-то кашу кода.

dilmah ★★★★★
()
Ответ на: комментарий от T-34

Я точно не знаю. Но например такая идея. Сложение U+V -- это ксор U^V^W, где W это маска переносов.

Таким образом если C+x=D^x, то C^x^W=D^x => W=C^D где W это маска переносов при сложении C и x. Зная маску переносов можно восстановить x.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

но может быть несколько решений.. а иногда даже очень много.. придется спускаться вниз, перебирая ветви дерева.. по какой укурке придумали этот алгоритм..

dilmah ★★★★★
()
Ответ на: комментарий от T-34

> иначе бы не взывал тут о помощи.

вай, Бен Саммерс, не узнал тебя в гриме, да

anonymous
()
Ответ на: комментарий от dilmah

Знаешь как то все это сложно черезчур. Ведь на самом деле все очень просто, решается обратным перебором массива с: edx ^= ecx ecx -= edx

Самое обидно что я изначально написал практически рабочий код, ну с маленькой ошибочкой, при преобразовании int edx в unsigned char. Что сразу натолкнуло на мысль о том что делаю чтото не то.

Тема закрыта. Всем спасибо...

Респект: anonymous (*) (06.03.2008 13:47:31) и k0l0b0k

T-34
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.