Русский / Russian English / Английский

Сейчас на форуме: Oxy, Adler, soft, yashechka (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

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

Ранг: 391.9 (мудрец)
Статус: Участник

Создано: 15 февраля 2013 10:52 · Поправил: BfoX New!
Цитата · Личное сообщение · #1

есть функа, которая ксорит данные по key[] длиной 12 байт

Code:
  1. void _Cipher(unsigned __int8 *InOut, int len)
  2. {
  3. int i;
  4. if ( len > 11 && len <= 250 )
  5. {
  6.          InOut[0] ^= InOut[1] ^ key[0];
  7.          for ( i = 1; len - 1 >= i; ++i )
  8.                  InOut[i] ^= InOut[- 1] ^ key[% 12];
  9.          InOut[len - 1] ^= InOut[len - 2] ^ key[0];
  10.          for ( i = len - 2; i >= 0; --i )
  11.                  InOut[i] ^= InOut[+ 1] ^ key[(len - i - 1) % 12];
  12.   }
  13. }


есть и
Code:
  1. void _DeCipher(unsigned __int8 *InOut, int len)
  2. {
  3. int i;
  4. if ( len > 11 && len <= 250 )
  5.  {
  6.          for ( i = 0; len - 2 >= i; ++i )
  7.                  InOut[i] ^= InOut[+ 1] ^ key[(len - i - 1) % 12];
  8.          InOut[len - 1] ^= InOut[len - 2] ^ key[0];
  9.          for ( i = len - 1; i > 0; --i )
  10.                  InOut[i] ^= InOut[- 1] ^ key[% 12];
  11.          InOut[0] ^= InOut[1] ^ key[0];
  12.  }
  13. }


хочу понять, можно ли восстановить key[]
вроде, по прикиду, нет.

реальный пример key[] = {0x53,0x49,0x4D,0x4F,0x4E,0x45,0x44,0x55,0x44,0x55,0x4C,0x55};

в общем случае плэйн может быть произвольный набор байт, key - фиксированный


Ранг: 157.3 (ветеран)
Статус: Участник

Создано: 15 февраля 2013 11:17 · Поправил: ZaZa New!
Цитата · Личное сообщение · #2

А почему собственно нельзя?
Тут ведь только XOR... Key не изменяется!
Если есть пары In - Out, то теоретически можно...


Ранг: 164.6 (ветеран)
Статус: Участник
Волшебник

Создано: 15 февраля 2013 11:32 · Поправил: neomant New!
Цитата · Личное сообщение · #3

Имеются пошифрованый и открытый наборы данных? Первый байт ключа: key[0] = Enc[0] ^ Enc[1] ^ Plain[1]. Дальше думать надо.


Ранг: 157.3 (ветеран)
Статус: Участник

Создано: 15 февраля 2013 11:38 · Поправил: ZaZa New!
Цитата · Личное сообщение · #4

neomant пишет:
Первый байт ключа: key[0] = Enc[0] ^ Enc[1] ^ Plain[1]. Дальше думать надо

Правильно, но только это должна быть последняя строка в функции, ведь перед этим должны другие байты восстановиться, включая 0 и 1 байт InOUT Не подумал, что IN известен...

Code:
  1. KEY: [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C]
  2.  
  3. IN: [0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16]
  4. OUT: [0x06, 0x0C, 0x0F, 0x03, 0x06, 0x08, 0x1F, 0x1F, 0x06, 0x04, 0x1F, 0x1B]
  5.  
  6. IN: [0x06, 0x0C, 0x0F, 0x03, 0x06, 0x08, 0x1F, 0x1F, 0x06, 0x04, 0x1F, 0x1B]
  7. OUT: [0x1C, 0x1B, 0x15, 0x16, 0x11, 0x14, 0x10, 0x0D, 0x04, 0x03, 0x0D, 0x16]

Во всех циклах байты из Key используются по порядку: сначала 2 байт, потом третий и т.д. после того, как был использован 12 байт, начинается все заново, но только с первого байта (деление по модулю на 12)...

Ранг: 13.0 (новичок)
Статус: Участник

Создано: 15 февраля 2013 11:54 New!
Цитата · Личное сообщение · #5

Нужно прогу выложить

Ранг: 391.9 (мудрец)
Статус: Участник

Создано: 15 февраля 2013 13:59 New!
Цитата · Личное сообщение · #6

ZaZa
neomant

подправил пост


Ранг: 326.1 (мудрец)
Статус: Участник

Создано: 15 февраля 2013 17:10 New!
Цитата · Личное сообщение · #7

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

Ранг: 391.9 (мудрец)
Статус: Участник

Создано: 15 февраля 2013 17:17 New!
Цитата · Личное сообщение · #8

Vamit

в том то и дело - генерится рандом дата, ксорится key-ем, результат запоминается и используется как ключ в blowfish, с помощью которого файло одевается в конверт.

в конверте сохраняется только поксоренные рандомные данные


Ранг: 164.6 (ветеран)
Статус: Участник
Волшебник

Создано: 15 февраля 2013 18:01 · Поправил: neomant New!
Цитата · Личное сообщение · #9

Если есть плаин и зашифрованный пакеты, можно попробовать брут на первые 6 байт ключа, оставшуюся часть получаем расчётом.
Code:
  1. em[0] = p[0] ^ p[1]  ^ k[0];
  2. em[1] = p[1] ^ em[0] ^ k[1];
  3. em[2] = p[2] ^ em[1] ^ k[2];
  4. em[3] = p[3] ^ em[2] ^ k[3];
  5. em[4] = p[4] ^ em[3] ^ k[4];
  6. em[5] = p[5] ^ em[4] ^ k[5];
  7.  
  8. k[(len - 1]%12) = em[0] ^ e[0] ^ e[1];
  9. k[(len - 2]%12) = em[1] ^ e[1] ^ e[2];
  10. k[(len - 3]%12) = em[2] ^ e[2] ^ e[3];
  11. k[(len - 4]%12) = em[3] ^ e[3] ^ e[4];
  12. k[(len - 5]%12) = em[4] ^ e[4] ^ e[5];
  13. k[(len - 6]%12) = em[5] ^ e[5] ^ e[6];

Если ничего не напутал.

Ранг: 583.2 (!)
Статус: Модератор

Создано: 15 февраля 2013 18:40 New!
Цитата · Личное сообщение · #10

imho, достаточно брута 1 байта. Надо посмотреть может и эту неоднозначность можно устранить.

Ранг: 0.4 (гость)
Статус: Участник

Создано: 27 марта 2013 02:23 · Поправил: maxidromm New!
Цитата · Личное сообщение · #11

Восстановить ключ только по шифротексту C можно только перебором в данном случае.

Представь такой шифр := C[i] = P[i]^k, P=plaintext, C=ciphertext, k=secret byte. Единственный способ - перебрать k. При этом криптостойкость оценивается в 8 бит.

В твоем примере имеем C = A*P + B*K, где A и B - некоторые линейные матрицы. Так как это шифр, то матрица А обязана иметь обратную и ее определитель не ноль, значит информацию может дать только матрица B. При len=12n+1, матрица B теряет 1 байт информации. Все остальные случаи - не теряет. То есть, для поиска ключа имея только C нужен полный перебор множества ключей кардиналити 2^96 (или 2^88) комбинаций.

Если есть пара (P, C) то достаточно len=12, просто решив матричное уравнение K=B^-1*(С-A*P), для len=12 матрица B невырожденная и имеет обратную.

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


Ранг: 85.4 (постоянный)
Статус: Участник

Создано: 27 марта 2013 17:29 New!
Цитата · Личное сообщение · #12

http://www.wolframalpha.com/input/?i=C+%3D+A*P+%2B+B*K%2C+solve+K


Ранг: 670.3 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 27 марта 2013 17:43 New!
Цитата · Личное сообщение · #13

drone


Этот решатель не понимает, что такое матрица.

Ранг: 85.4 (постоянный)
Статус: Участник

Создано: 29 марта 2013 09:18 New!
Цитата · Личное сообщение · #14

http://www.wolframalpha.com/examples/Matrices.html
 eXeL@B —› Основной форум —› xor

Видеокурс ВЗЛОМ