Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› нужно опознать криптоалгоритм
Посл.ответ Сообщение


Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 21 сентября 2013 01:44
· Личное сообщение · #1

Доброго времени суток всем!

Ковыряя ресурсы одной игрушки, наткнулся на расшифровку данных по какому-то алгоритму.
На самопал слабо похоже - если разработчик и решает защитить ресурсы своим алго, то обычно дальше xor/rol/sub никто не заходит. А тут что-то хитрое, с расшифровкой по ключу (который намертво зашит в код). Поэтому мне и кажется, что тут был использован какой-то готовый алгоритм. Опознать его мне не удаётся - констант в коде нет, криптосёрчеры молчат, а я в криптографии не силён.

Я рипнул и перевёл код, но понимания это не принесло. Сорец в аттаче.


ЗЫ: нет, разворачивать принцип мне не нужно. Просто хочу узнать, что это за алго.


480f_21.09.2013_EXELAB.rU.tgz - algo.cpp




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 21 сентября 2013 02:03
· Личное сообщение · #2

IDEA

| Сообщение посчитали полезным: -=AkaBOSS=-


Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 21 сентября 2013 02:11 · Поправил: DimitarSerg
· Личное сообщение · #3

Очень похоже на IDEA (процедура mul, у тебя weirdproc )... нашёл в DcpCrypt (искал по and $FFFF)

add
reversecode
А вы шутрее оказались

add2:
Ну и собственно у Шнейера на сайте:
Code:
  1.  void Idea(u_int16 *in, u_int16 *out, u_int16 *key)
  2.  {
  3.          register u+int16 x0, x1, x2, x3, s1, s2, round;
  4.  
  5.          x0 = *in++; x1 = *in++; x2 = *in++; x3 = *in;
  6.  
  7.          for (round = 0; round < 8; round++) {
  8.          x0 *= *key++;
  9.          x1 += *key++;
  10.          x2 += *key++;
  11.          x3 *= *key++;
  12.  
  13.          s1  = x1; s2 = x2;
  14.          x2 ^= x0; x1 ^= x3;
  15.  
  16.          x2 *= *key++;
  17.          x1 += x2;
  18.          x1 *= *key++;
  19.          x2 += x1;
  20.  
  21.          x0 ^= x1; x3 ^= x2;
  22.          x1 ^= s2; x2 ^= s1;
  23.          }
  24.          *out++ = x0 * *key++;
  25.          *out++ = x2 + *key++; /* Yes, this is x2, not x1 */
  26.          *out++ = x1 + *key++;
  27.          *out    = x3 * *key;
  28.  }


-----
ds


| Сообщение посчитали полезным: -=AkaBOSS=-


Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 21 сентября 2013 05:07 · Поправил: -=AkaBOSS=-
· Личное сообщение · #4

reversecode, DimitarSerg - большое спасибо!

Возник еще один вопрос:
а можно ли трансформировать ключ обратно к 128-битному виду?

я нашёл такое описание:
Code:
  1. Задача процедуры расширения ключа - формирование 52 16-битных подключей, используемых в раундах шифрования и дополнительных преобразованиях (т. е. всего 832 бита ключевой информации). Данная процедура весьма проста, и выполняется она следующим образом:
  2.  
  3.    1. 128-битный ключ шифрования делится на восемь подключей по 16 бит; они становятся первыми восемью подключами алгоритма (K11, K12, K13, K14, K15, K16, K21, K22).
  4.    2. Ключ шифрования циклически сдвигается влево на 25 бит.
  5.    3. Результат делится на восемь следующих подключей.
  6.    4. Ключ шифрования циклически сдвигается влево на 25 бит, и так далее до выработки необходимого количества подключей.


Проблема в том, что в программе зашит уже расширенный ключ, и мне кажется, что в данном случае он не является трансформированным 128-битным, а представляет собой просто рандомный набор.
Или я ошибаюсь?

ADD
мдя. проспался, почитал описание алгоритма повнимательнее...
получается, что исходный ключ сначала расширяется по алгоритму, который описан выше, а потом ЕЩЕ РАЗ трансформируется для получения ключа для дешифровки...
ладно, буду разбираться...




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 21 сентября 2013 13:20 · Поправил: reversecode
· Личное сообщение · #5

ну что бы продолжить квест, этот алго 1 в 1 с аттача похож на реализацию в библиотеке botan
могу еще подсыпать уголька ;) и сказать что такую тему с таким алго уже на лабе поднимали и тоже угадывали




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 22 сентября 2013 02:07 · Поправил: -=AkaBOSS=-
· Личное сообщение · #6

reversecode пишет:
такую тему с таким алго уже на лабе поднимали

ЭТУ, видимо.
Но я уже покопал исходники разных реализаций алгоритма, порипал код (в аттаче).

Ключ всё-таки получилось вернуть к 128-битному виду, но возник неожиданный нюанс - при использовании во внешних приложениях результат расшифровки не совпадает.

Code:
  1. // этот комплект данных я рипнул из программы
  2. // шифрование/расшифровка по алгоритму происходит правильно,
  3. // но проверка через CrypTool даёт другие результаты...
  4. byte Key0[]             = { 0x7B,0x00,0x6F,0x00,0x0A,0x00,0x0C,0x00,0xDE,0x00,0x5A,0x00,0x01,0x00,0x08,0x00   };
  5. byte EncData0[]   = { 0xDB,0x42,0xA3,0xC5,0x1F,0xD7,0xCE,0x05    }; // зашифрованные данные из программы
  6. byte DecData0[]   = { 0x78,0x9C,0xBD,0x7D,0x09,0x7C,0x1B,0xC7    }; // расшифрованные данные - начало zLib потока
  7.  
  8. // а эти два комплекта я нашёл в исходниках DCPCrypt - dcpidea.pas
  9. // зашифрованные/расшифрованные результаты не совпадают с ожидаемыми
  10. // при проверке через CrypTool выходные данные соответствуют ожидаемым
  11. byte Key1[]             = { 0x3A,0x98,0x4E,0x20,0x00,0x19,0x5D,0xB3,0x2E,0xE5,0x01,0xC8,0xC4,0x7C,0xEA,0x60   };
  12. byte DecData1[]   = { 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08    };
  13. byte EncData1[]   = { 0x97,0xBC,0xD8,0x20,0x07,0x80,0xDA,0x86    };
  14.  
  15. byte Key2[]             = { 0x00,0x64,0x00,0xC8,0x01,0x2C,0x01,0x90,0x01,0xF4,0x02,0x58,0x02,0xBC,0x03,0x20   };
  16. byte DecData2[]   = { 0x05,0x32,0x0A,0x64,0x14,0xC8,0x19,0xFA    };
  17. byte EncData2[]   = { 0x65,0xBE,0x87,0xE7,0xA2,0x53,0x8A,0xED    };


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

97cc_22.09.2013_EXELAB.rU.tgz - algo.cpp


/ADD
Таки разобрался cо своим вопросом.
Несовпадения возникали из-за несоответствия байтового порядка.
Стандартные утилиты (CrypTool etc) при шифровании/расшифровке по-умолчанию преобразуют входящие данные и ключ в big-endian, а та реализация алгоритма, с которой я столкнулся и рипнул, работала с тем что дают и не выёживалась)

Проблема решена - тему закрываю.


 eXeL@B —› Программирование —› нужно опознать криптоалгоритм
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати