Сейчас на форуме: rmn, exp50848 (+7 невидимых)

 eXeL@B —› Основной форум —› Реверс алгоритма
Посл.ответ Сообщение

Ранг: 74.1 (постоянный), 34thx
Активность: 0.030
Статус: Участник

Создано: 03 января 2013 12:47
· Личное сообщение · #1

Приветствую. Имеется алго шифрования. Нужно сделать дешифровщик

Исходные данные: криптует блоками по 8 байт
ключ криптования постоянный


исходные данные
03 B8 FE 02 B3 06 F5 00

зашифрованные
1C 6F 3F A5 47 7F 77 80


дамп ключа
E1 02 72 54 BC 50 A1 E2 12 FF EF 4D C7 2A 44 13
ED 69 49 00 08 00 00 00 CD 0B 72 00 C0 A8 00 C8


Функция криптования:

Code:
  1. int __cdecl crypt2(int key, int src1, int dst_)
  2. {
  3.   int resPart1; // ecx@1
  4.   int resPart2; // eax@1
  5.   signed int byteCount; // edi@1
  6.  
  7.  
  8.   // Запаковка 8 байт в 2 dword
  9.   resPart1 = *(_BYTE *)(src1 + 3) | ((*(_BYTE *)(src1 + 2) | ((*(_BYTE *)(src1 + 1) | (*(_BYTE *)src1 << 8)) << 8)) << 8);
  10.   resPart2 = *(_BYTE *)(src1 + 7) | ((*(_BYTE *)(src1 + 6) | ((*(_BYTE *)(src1 + 5) | (*(_BYTE *)(src1 + 4) << 8)) << 8)) << 8);
  11.   byteCount = 8;
  12.  
  13.     v7 = 0;
  14.     do
  15.     {
  16.       v8 = ((v7 + *(_DWORD *)(key + 4 * (v7 & 3))) ^ (resPart2 + (16 * resPart2 ^ ((unsigned int)resPart2 >> 5))))
  17.          + resPart1;
  18.       v9 = v7 - 0x61C88647;
  19.       v10 = ((v9 + *(_DWORD *)(key + 4 * ((v9 >> 11) & 3))) ^ (v8 + (16 * v8 ^ (v8 >> 5)))) + resPart2;
  20.       v11 = ((v9 + *(_DWORD *)(key + 4 * (v9 & 3))) ^ (v10 + (16 * v10 ^ (v10 >> 5)))) + v8;
  21.       v9 -= 0x61C88647u;
  22.       v12 = ((v9 + *(_DWORD *)(key + 4 * ((v9 >> 11) & 3))) ^ (v11 + (16 * v11 ^ (v11 >> 5)))) + v10;
  23.       v13 = ((v9 + *(_DWORD *)(key + 4 * (v9 & 3))) ^ (v12 + (16 * v12 ^ (v12 >> 5)))) + v11;
  24.       v9 -= 0x61C88647u;
  25.       v14 = ((v9 + *(_DWORD *)(key + 4 * ((v9 >> 11) & 3))) ^ (v13 + (16 * v13 ^ (v13 >> 5)))) + v12;
  26.       resPart1 = ((v9 + *(_DWORD *)(key + 4 * (v9 & 3))) ^ (v14 + (16 * v14 ^ (v14 >> 5)))) + v13;
  27.       v7 = v9 - 0x61C88647;
  28.       resPart2 = ((v7 + *(_DWORD *)(key + 4 * ((v7 >> 11) & 3))) ^ (resPart1
  29.                                                                   + (16 * resPart1 ^ ((unsigned int)resPart1 >> 5))))
  30.                + v14;
  31.       --byteCount;
  32.     }
  33.     while ( byteCount );
  34.  
  35.  
  36.   // Распаковка из 2x dword в массив 8 байт
  37.   *(_BYTE *)dst_ = BYTE3(resPart1);
  38.   *(_BYTE *)(dst_ + 1) = (unsigned int)resPart1 >> 16;
  39.   *(_BYTE *)(dst_ + 3) = resPart1;
  40.   *(_BYTE *)(dst_ + 2) = BYTE1(resPart1);
  41.   *(_BYTE *)(dst_ + 4) = BYTE3(resPart2);
  42.   *(_BYTE *)(dst_ + 5) = (unsigned int)resPart2 >> 16;
  43.   *(_BYTE *)(dst_ + 6) = BYTE1(resPart2);
  44.   *(_BYTE *)(dst_ + 7) = resPart2;
  45.   return resPart2;
  46. }
  47.  
  48.  




Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 03 января 2013 13:03 · Поправил: Veliant
· Личное сообщение · #2

Выложи ехе, либо выставь нормальные типы
dst_ и src1 - структура либо массив char
key - не int а массив int'ов



Ранг: 74.1 (постоянный), 34thx
Активность: 0.030
Статус: Участник

Создано: 03 января 2013 13:20
· Личное сообщение · #3

Veliant
Не заметил ошибку декомпиля.


Прототип у функции такой:
int __cdecl crypt2(BYTE* key, BYTE* src1, BYTE* dst_)



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 03 января 2013 13:34 · Поправил: Veliant
· Личное сообщение · #4

На модификацию TEA смахивает



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 03 января 2013 14:13 · Поправил: Veliant
· Личное сообщение · #5

Извиняюсь за несколько постов подряд, просто чтоб был up темы
Code:
  1. void decrypt2(ULONG *key, UCHAR *src1, UCHAR *dst_)
  2. {
  3.          ULONG p1; // ecx@1
  4.          ULONG p2; // eax@1
  5.          signed int byteCount; // edi@1
  6.  
  7.  
  8.          // Запаковка 8 байт в 2 dword
  9.          p1 = src1[3] | ((src1[2] | ((src1[1] | (src1[0] << 8)) << 8)) << 8);
  10.          p2 = src1[7] | ((src1[6] | ((src1[5] | (src1[4] << 8)) << 8)) << 8);
  11.          byteCount = 8;
  12.  
  13.          ULONG v7 = 0xC6EF3720;
  14.          // расчет константы
  15.          //for (int i = 0; i < 8; i++) {v7 -= 0x61C88647;v7 -= 0x61C88647;v7 -= 0x61C88647;v7 -= 0x61C88647;}
  16.          do
  17.          {
  18.                  ULONG v14 = p2  - ((v7 + key[(v7 >> 11) & 3]) ^ (p1  + (16 * p1  ^ (p1  >> 5))));
  19.                  v7 += 0x61C88647;
  20.                  ULONG v13 = p1  - ((v7 + key[v7 & 3])         ^ (v14 + (16 * v14 ^ (v14 >> 5))));
  21.                  ULONG v12 = v14 - ((v7 + key[(v7 >> 11) & 3]) ^ (v13 + (16 * v13 ^ (v13 >> 5))));
  22.                  v7 += 0x61C88647u;
  23.                  ULONG v11 = v13 - ((v7 + key[v7 & 3])         ^ (v12 + (16 * v12 ^ (v12 >> 5))));
  24.                  ULONG v10 = v12 - ((v7 + key[(v7 >> 11) & 3]) ^ (v11 + (16 * v11 ^ (v11 >> 5))));
  25.                  v7 += 0x61C88647u;
  26.                  ULONG v8  = v11 - ((v7 + key[v7 & 3])         ^ (v10 + (16 * v10 ^ (v10 >> 5))));
  27.                  p2        = v10 - ((v7 + key[(v7 >> 11) & 3]) ^ (v8  + (16 * v8  ^ (v8  >> 5))));
  28.                  v7 += 0x61C88647;
  29.                  p1        = v8  - ((v7 + key[v7 & 3])         ^ (p2  + (16 * p2  ^ (p2  >> 5))));
  30.                  --byteCount;
  31.          }
  32.          while (byteCount);
  33.  
  34.          // Распаковка из 2x dword в массив 8 байт
  35.          dst_[0] = (p1 >> 24) & 0xFF;
  36.          dst_[1] = (p1 >> 16) & 0xFF;
  37.          dst_[2] = (p1 >> 8)  & 0xFF;
  38.          dst_[3] = p1 & 0xFF;
  39.          dst_[4] = (p2 >> 24) & 0xFF;
  40.          dst_[5] = (p2 >> 16) & 0xFF;
  41.          dst_[6] = (p2 >> 8)  & 0xFF;
  42.          dst_[7] = p2 & 0xFF;
  43. }


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


Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 03 января 2013 15:34 · Поправил: OKOB
· Личное сообщение · #6

ИМХО XTEA с полуразвернутым циклом (4 в теле цикла по 8), в оригинале 32.

Code:
  1. #include <stdio.h>
  2.  
  3. void xtea_encipher(unsigned int* vi, unsigned int* vo, unsigned int* k) 
  4. {
  5.     unsigned int i;
  6.  
  7.     unsigned int v0=vi[0], v1=vi[1], sum=0, delta=0x9E3779B9;
  8.  
  9.     for (i=0; i < 32; i++) {
  10.         v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
  11.         sum += delta;
  12.         v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
  13.     }
  14.     vo[0]=v0; vo[1]=v1;
  15. }
  16.  
  17. void xtea_decipher(unsigned int* vi, unsigned int* vo, unsigned int* k) 
  18. {
  19.     unsigned int i;
  20.  
  21.     unsigned int v0=vi[0], v1=vi[1], delta=0x9E3779B9, sum=delta*32;
  22.     for (i=0; i < 32; i++) {
  23.         v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
  24.         sum -= delta;
  25.         v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
  26.     }
  27.     vo[0]=v0; vo[1]=v1;
  28. }
  29.  
  30. unsigned char ckey[] = {0xE1,0x02,0x72,0x54,0xBC,0x50,0xA1,0xE2,0x12,0xFF,0xEF,0x4D,0xC7,0x2A,0x44,0x13,0xED,0x69,0x49,0x00,0x08,0x00,0x00,0x00,0xCD,0x0B,0x72,0x00,0xC0,0xA8,0x00,0xC8};
  31.  
  32. int main(int argc, char* argv[])
  33. {
  34.          unsigned uikey[8];
  35.          unsigned usrc[2] = {0x03B8FE02, 0xB306F500};
  36.          unsigned udst[2];
  37.  
  38.          for(int i=0; i<32; i+=4)
  39.                  uikey[i/4] = ckey[i] | (ckey[i+1] | (ckey[i+2] | (ckey[i+3] << 8)) << 8) << 8;
  40.          printf("SRC: %08X-%08X\n", usrc[0], usrc[1]);
  41.          xtea_encipher(usrc, udst, uikey);
  42.          printf("ENCRYPTED: %08X-%08X\n", udst[0], udst[1]);
  43.          xtea_decipher(udst, usrc, uikey);
  44.          printf("DECRYPTED: %08X-%08X\n", usrc[0], usrc[1]);
  45.          return 0;
  46. }


все воркает, таки да XTEA

-----
127.0.0.1, sweet 127.0.0.1


| Сообщение посчитали полезным: DimitarSerg, Rustem, plutos, carver

Ранг: 74.1 (постоянный), 34thx
Активность: 0.030
Статус: Участник

Создано: 04 января 2013 21:48
· Личное сообщение · #7

Все работает, спасибо!




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 04 января 2013 22:32
· Личное сообщение · #8

На этом, видимо, можно закрыть.


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