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

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

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

Создано: 15 февраля 2013 10:52 · Поправил: BfoX
· Личное сообщение · #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 - фиксированный

-----
...или ты работаешь хорошо, или ты работаешь много...





Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

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

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

-----
One death is a tragedy, one million is a statistic.





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

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

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

-----
Следуй за белым кроликом





Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 15 февраля 2013 11:38 · Поправил: ZaZa
· Личное сообщение · #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)...

-----
One death is a tragedy, one million is a statistic.




Ранг: 13.0 (новичок), 2thx
Активность: 0.030
Статус: Участник

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

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



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

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

ZaZa
neomant

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

-----
...или ты работаешь хорошо, или ты работаешь много...





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

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

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

-----
Everything is relative...




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

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

Vamit

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

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

-----
...или ты работаешь хорошо, или ты работаешь много...





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

Создано: 15 февраля 2013 18:01 · Поправил: neomant
· Личное сообщение · #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];

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

-----
Следуй за белым кроликом




Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

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

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

-----
старый пень




Ранг: 0.4 (гость), 2thx
Активность: 0=0
Статус: Участник

Создано: 27 марта 2013 02:23 · Поправил: maxidromm
· Личное сообщение · #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 (постоянный), 51thx
Активность: 0.090
Статус: Участник

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

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

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

drone


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

-----
Stuck to the plan, always think that we would stand up, never ran.




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

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

http://www.wolframalpha.com/examples/Matrices.html


 eXeL@B —› Основной форум —› xor
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати