eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
обновлён 2 декабря!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

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

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

 eXeL@B —› Основной форум —› Расшифровка алгоритма шифрования микропроцессорного устройства
<< . 1 . 2 .
Посл.ответ Сообщение

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

Создано: 26 ноября 2010 02:25 New!
Цитата · Личное сообщение · #1

Здравствуйте. Я на форуме новенький и на взмоме программ не специализируюсь, я электронщик. Прошу вашей помощи в отломе алгоритма обмена микропроцессорной системы. В кратце опишу принцип ее работы.
Одно промышленное устройство (программатор) подключается к контроллеру для изменения его настроек или перепрошивки по своему протоколу (протокол описывать не буду т.к. с ним я разобрался, проблема в шифровании). И в начале сеанса связи контроллер посылает программатору 2 байта, а затем ждет правильного ответа от него (тоже размером 2 байта), и если все прокатило, то начинается сеанс обмена данными. Я хочу сделать свой бюджетный вариант программатора. Мне удалось сдернуть весе варианты ЗАПРОС-ОТВЕТ, их я прикрепил к сообщению (в файле все понятно - слева посылка контроллера, а справа ответ программатора). В принципе я уже могу устанавливать сеанс связи по этой таблице, но у меня цель сделать автономное устройство с ЖК экраном для внесения некоторый корректировок в контроллер, и сами понимаете что я очень ограничен в объеме используемой памяти и не могу просто взять и запихнуть эту таблицу в AVR микроконтроллер с 4К памяти...
Буду благодарен за любую оказанную помощь.

{ Атач доступен только для участников форума } - Zapros-Otvet.rar


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

Создано: 28 ноября 2010 09:00 · Поправил: gazlan New!
Цитата · Личное сообщение · #2

V1KT0P пишет:
хоть и странный, но компактный способ


Дались вам эти регрессии... Все гораздо проще.

Второй ниббл совершенно симметричен с первым в том отношении, что управляется двумя параметрами (степенями свободы) геометрии таблицы. Но если первый был фиксирован по внутренней строке подгруппы (все нибблы строки идентичны), то второй фиксирован по внутреннему столбцу подгруппы (все нибблы столбца идентичны).

Таким образом, алго вычисления второго ниббла - это просто транспозиция алго вычисления первого.

В эташе таблицы, исходник и исполняемый файл.

Если для первого ниббла XOR выполнялся между строками (по столбцу), то для второго ниббла XOR выполнен между столбцами (по строке), так что строку отчета следует рассматривать как массив из 256 nibbles без пробелов - они вставлены только для удобства чтения.

Если трактовать каждый внутренний блок (клеточку в моей таблице) как вложенный двумерный объект с внутренними координатами (строка, столбец) и полную таблицу как охватывающий двумерный объект с координатами (строка блока, столбец блока), то получаем ровно 4 степени свободы, управляющие шифрованием. Для каждого ниббла фиксируются две из них, и оставшиеся две задают алго шифрования (начальную константу и изменение шага XOR'а - этакий микро-AES ). Не удивлюсь, если и сами эти параметры получаются пермутацией какого-либо S-box'а - алго сделан очень изящно и компактно

{ Атач доступен только для участников форума } - qw2.rar

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

Создано: 29 ноября 2010 02:41 New!
Цитата · Личное сообщение · #3

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

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

Создано: 29 ноября 2010 04:29 New!
Цитата · Личное сообщение · #4

shved Врятли, не получается найти закономерность от которой можно оттолкнуться .

gazlan Ты понял какой там алгоритм? Дай ссылки почитать по тому что ты пишешь, а то я не могу понять тебя. Мне бы посмотреть на пример решения подобной задачи, а то я пока что нуб в криптографии.


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

Создано: 29 ноября 2010 08:25 · Поправил: gazlan New!
Цитата · Личное сообщение · #5

V1KT0P пишет:
посмотреть на пример решения


#23, #25 с предыдущей страницы. Не в точности, конечно, но похоже.

Ссылки как-то затрудняюсь, разве что, на статьи по блочным шифрам .
h**p://w*w.enlight.ru/crypto/
h**p://pv.bstu.ru/crypto/blcipher.pdf

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

Коротко, 4 ниббла запроса образуют 4-мерное координатное пространство с 16 возможными битовыми состояниями по каждой координате (всего 65,536 состояний).

Фиксируя две координаты из четырех, мы получаем подпространство 16*16, которое удобно назвать блоком.

Блоки можно составить в таблицу 16*16, отобразив, таким образом, все пространство состояний запроса в двухуровневый набор таблиц 16*16.

На верхнем уровне - таблица блоков 16*16, на нижнем - собственно, сами блоки в виде массива 256 возможных ответов (16*16).

В этой таблице, например, фиксированы две координаты (два старших ниббла), а все возможные комбинации состояний двух младших образуют двумерное пространство 16*16:

Code:
  1. +-----------+-----------+-----------+-----------+-----------+---------         --+-----------+-----------+-----------+-----------+-----------+------- ----+-----------+-----------+-----------+-----------+
  2. |    00     |    01     |    02     |    03     |    04     |    05     |    06     |    07     |    08     |    09     |    0A     |    0B     |    0C     |    0D     |    0E     |    0F     |
  3. +-----------+-----------+-----------+-----------+-----------+---------         --+-----------+-----------+-----------+-----------+-----------+------- ----+-----------+-----------+-----------+-----------+
  4. | 0000 33CD | 0010 22DD | 0020 11ED | 0030 00FD | 0040 FF8D | 0050 EE9D | 0060 DDAD | 0070 CCBD | 0080 BB4D | 0090 AA5D | 00A0 996D | 00B0 887D | 00C0 770D | 00D0 661D | 00E0 552D | 00F0 443D |
  5. | 0001 22CC | 0011 33DC | 0021 00EC | 0031 11FC | 0041 EE8C | 0051 FF9C | 0061 CCAC | 0071 DDBC | 0081 AA4C | 0091 BB5C | 00A1 886C | 00B1 997C | 00C1 660C | 00D1 771C | 00E1 442C | 00F1 553C |
  6. | 0002 55CF | 0012 44DF | 0022 77EF | 0032 66FF | 0042 998F | 0052 889F | 0062 BBAF | 0072 AABF | 0082 DD4F | 0092 CC5F | 00A2 FF6F | 00B2 EE7F | 00C2 110F | 00D2 001F | 00E2 332F | 00F2 223F |
  7. | 0003 44CE | 0013 55DE | 0023 66EE | 0033 77FE | 0043 888E | 0053 999E | 0063 AAAE | 0073 BBBE | 0083 CC4E | 0093 DD5E | 00A3 EE6E | 00B3 FF7E | 00C3 000E | 00D3 111E | 00E3 222E | 00F3 333E |
  8. | 0004 00C9 | 0014 FFD9 | 0024 EEE9 | 0034 DDF9 | 0044 4489 | 0054 3399 | 0064 22A9 | 0074 11B9 | 0084 8849 | 0094 7759 | 00A4 6669 | 00B4 5579 | 00C4 CC09 | 00D4 BB19 | 00E4 AA29 | 00F4 9939 |
  9. | 0005 11C8 | 0015 EED8 | 0025 FFE8 | 0035 CCF8 | 0045 5588 | 0055 2298 | 0065 33A8 | 0075 00B8 | 0085 9948 | 0095 6658 | 00A5 7768 | 00B5 4478 | 00C5 DD08 | 00D5 AA18 | 00E5 BB28 | 00F5 8838 |
  10. | 0006 11CB | 0016 00DB | 0026 33EB | 0036 22FB | 0046 DD8B | 0056 CC9B | 0066 FFAB | 0076 EEBB | 0086 994B | 0096 885B | 00A6 BB6B | 00B6 AA7B | 00C6 550B | 00D6 441B | 00E6 772B | 00F6 663B |
  11. | 0007 00CA | 0017 11DA | 0027 22EA | 0037 33FA | 0047 CC8A | 0057 DD9A | 0067 EEAA | 0077 FFBA | 0087 884A | 0097 995A | 00A7 AA6A | 00B7 BB7A | 00C7 440A | 00D7 551A | 00E7 662A | 00F7 773A |
  12. | 0008 44C5 | 0018 BBD5 | 0028 AAE5 | 0038 99F5 | 0048 0085 | 0058 7795 | 0068 66A5 | 0078 55B5 | 0088 CC45 | 0098 3355 | 00A8 2265 | 00B8 1175 | 00C8 8805 | 00D8 FF15 | 00E8 EE25 | 00F8 DD35 |
  13. | 0009 55C4 | 0019 AAD4 | 0029 BBE4 | 0039 88F4 | 0049 1184 | 0059 6694 | 0069 77A4 | 0079 44B4 | 0089 DD44 | 0099 2254 | 00A9 3364 | 00B9 0074 | 00C9 9904 | 00D9 EE14 | 00E9 FF24 | 00F9 CC34 |
  14. | 000A 22C7 | 001A DDD7 | 002A CCE7 | 003A FFF7 | 004A 6687 | 005A 1197 | 006A 00A7 | 007A 33B7 | 008A AA47 | 009A 5557 | 00AA 4467 | 00BA 7777 | 00CA EE07 | 00DA 9917 | 00EA 8827 | 00FA BB37 |
  15. | 000B 33C6 | 001B CCD6 | 002B DDE6 | 003B EEF6 | 004b 7786 | 005B 0096 | 006B 11A6 | 007B 22B6 | 008B BB46 | 009B 4456 | 00AB 5566 | 00BB 6676 | 00CB FF06 | 00DB 8816 | 00EB 9926 | 00FB AA36 |
  16. | 000C 88C1 | 001C 77D1 | 002C 66E1 | 003C 55F1 | 004C CC81 | 005C BB91 | 006C AAA1 | 007C 99B1 | 008C 0041 | 009C FF51 | 00AC EE61 | 00BC DD71 | 00CC 4401 | 00DC 3311 | 00EC 2221 | 00FC 1131 |
  17. | 000D 99C0 | 001D 66D0 | 002D 77E0 | 003D 44F0 | 004D DD80 | 005D AA90 | 006D BBA0 | 007D 88B0 | 008D 1140 | 009D EE50 | 00AD FF60 | 00BD CC70 | 00CD 5500 | 00DD 2210 | 00ED 3320 | 00FD 0030 |
  18. | 000E 66C3 | 001E 99D3 | 002E 88E3 | 003E BBF3 | 004E 2283 | 005E 5593 | 006E 44A3 | 007E 77B3 | 008E EE43 | 009E 1153 | 00AE 0063 | 00BE 3373 | 00CE AA03 | 00DE DD13 | 00EE CC23 | 00FE FF33 |
  19. | 000F 77C2 | 001F 88D2 | 002F 99E2 | 003F AAF2 | 004F 3382 | 005F 4492 | 006F 55A2 | 007F 66B2 | 008F FF42 | 009F 0052 | 00AF 1162 | 00BF 2272 | 00CF BB02 | 00DF CC12 | 00EF DD22 | 00FF EE32 |
  20. +-----------+-----------+-----------+-----------+-----------+---------         --+-----------+-----------+-----------+-----------+-----------+------- ----+-----------+-----------+-----------+-----------+


Алго шифрования является, по сути, кривым зеркалом, отражающим каждый бит запроса в другую точку таблицы (или, что тоже самое, в ту же самую точку другой таблицы).

TC предоставил нам таблицу Q-A, которую можно трактовать или как отражение таблицы запроса в саму себя, или как две связанные таблицы (словарь) "Запрос - Ответ". Математически это одно и то же - некоторое алго преобразования координат.

Это алго можно рассматривать как просто табличную подстановку: для каждого ниббла строим таблицу замен (S-box) размером 4*4 и элемент с номером i (0..15) из "Запрос" заменяем на элемент с тем же самым номером из S-box.

Из приведенной выше таблицы с двумя фиксированными старшими нибблами (00**), мы видим, что изменение младшего ниббла q0 ответа зависит только от номера строки в этой таблице, и изменение следующего ниббла ответа q1 зависит только от номера столбца в этой таблице. Для других таблиц, ситуация аналогична.

Это позволяет утверждать, что преобразование 4-адреса осуществляется независимо по каждой из координат, и, таким образом, сводится к нахождению 4-х преобразований 1-адресов (преобразования нибблов независимы).

Тем самым, вся задача поиска алго преобразования (отражения) разбивается на 4 независимых подзадачи.


Как я уже показывал, S-boxes для разных блоков получаются как пермутация некоторого исходного блока. Причем, независимо от того, как именно алгоритмически реализована эта пермутация, математически это может быть записано как некоторая последовательность XOR-преобразований над исходным S-box.

Вычислив все эти последовательности (я это сделал только для двух младших нибблов) и зная начальные состояния S-box(es) можно построить функционально идентичный алгоритм преобразования (отражения).


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

Создано: 29 ноября 2010 13:08 · Поправил: gazlan New!
Цитата · Личное сообщение · #6

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

В эташе программа сортировки по нибблам запроса (0..3).

Скажем, если указать в качестве первого параметра 0, то первые 16 таблиц будут построены для q0 = 00h, следующие 16 для q0 = 01h etc. Остальные нибблы сортируются в обычном порядке. Если указать в качестве первого параметра 3, то первые 16 таблиц будут построены для q3 = 00h, следующие 16 для q3 = 01h etc.

Работает все с тем же файлом от TC (из второго поста).

Заодно, немного изменил заголовок таблиц, для облегчения навигации. Теперь две первых цифры (до двоеточия) обозначают строку блока, две последние - столбец. В любом текстовом редакторе, поддерживающем функцию поиска, можно быстро перейти к любому блоку, просто набрав его номер как: LL:CC

Code:
  1. +-----------+-----------+-----------+-----------+-
  2. |   00:00   |   00:01   |   00:02   |   00:03   | 
  3. +-----------+-----------+-----------+-----------+-
  4. | 0000 33CD | 0100 89D2 | 0200 DFD7 | 0300 30DC | 
  5. | 0010 22DD | 0110 76C2 | 0210 20C7 | 0310 21CC | 
  6. | 0020 11ED | 0120 ABF2 | 0220 FDF7 | 0320 12FC | 
  7. | 0030 00FD | 0130 98E2 | 0230 CEE7 | 0330 03EC | 
  8. | 0040 FF8D | 0140 4592 | 0240 1397 | 0340 FC9C | 
  9. | 0050 EE9D | 0150 3282 | 0250 6487 | 0350 ED8C | 
  10. | 0060 DDAD | 0160 67B2 | 0260 31B7 | 0360 DEBC | 
  11. | 0070 CCBD | 0170 54A2 | 0270 02A7 | 0370 CFAC | 
  12. | 0080 BB4D | 0180 0152 | 0280 5757 | 0380 B85C | 
  13. | 0090 AA5D | 0190 FE42 | 0290 A847 | 0390 A94C | 


{ Атач доступен только для участников форума } - qas.rar

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

Создано: 29 ноября 2010 20:55 · Поправил: V1KT0P New!
Цитата · Личное сообщение · #7

gazlan Построил 4-мерную таблицу, таблицу 00 я взял за отправную, так как там в линии повторяются символы, то она сократилась до одной строчки:
Code:
  1. DCFE98BA54761032

Проксорил таблицу 00 с остальными, получились таблицы состоящии из одного элемента. В результате сократилось до одной таблицы:
Code:
  1. 0000777766661111
  2. FFFF2222DDDDCCCC
  3. AAAA99998888BBBB
  4. 1111444477776666
  5. CCCC33332222DDDD
  6. BBBBEEEE99998888
  7. 6666555544447777
  8. DDDD000033332222
  9. 8888FFFFEEEE9999
  10. 7777AAAA55554444
  11. 2222111100003333
  12. 9999CCCCFFFFEEEE
  13. 4444BBBBAAAA5555
  14. 3333666611110000
  15. EEEDDDDCCCCFFFFE
  16. 5558888BBBBAAAA5

Вот тут я не могу понять как разбить эту таблицу на две строки.

Код генерирующий 4-й ниббл:
Code:
  1. #include <iostream>
  2. using namespace std;
  3. int main(int argc, char *argv[]){
  4.     int i,z;
  5.     unsigned char i1,i2,i3,i4,o1,o2,o3,o4;
  6.     unsigned char T1[16]={0xD,0xC,0xF,0xE,0x9,0x8,0xB,0xA,0x5,0x4,0x7,0x6,0x1,0x0,0x3,0x 2};
  7.     unsigned char T2[16][16]={0x0,0x0,0x0,0x0,0x7,0x7,0x7,0x7,0x6,0x6,0x6,0x6,0x1,0x1,0x 1,0x1
  8.                               ,0xF,0xF,0xF,0xF,0x2,0x2,0x2,0x2,0xD,0xD,0xD,0xD,0xC,0xC,0xC,0xC
  9.                               ,0xA,0xA,0xA,0xA,0x9,0x9,0x9,0x9,0x8,0x8,0x8,0x8,0xB,0xB,0xB,0xB
  10.                               ,0x1,0x1,0x1,0x1,0x4,0x4,0x4,0x4,0x7,0x7,0x7,0x7,0x6,0x6,0x6,0x6
  11.                               ,0xC,0xC,0xC,0xC,0x3,0x3,0x3,0x3,0x2,0x2,0x2,0x2,0xD,0xD,0xD,0xD
  12.                               ,0xB,0xB,0xB,0xB,0xE,0xE,0xE,0xE,0x9,0x9,0x9,0x9,0x8,0x8,0x8,0x8
  13.                               ,0x6,0x6,0x6,0x6,0x5,0x5,0x5,0x5,0x4,0x4,0x4,0x4,0x7,0x7,0x7,0x7
  14.                               ,0xD,0xD,0xD,0xD,0x0,0x0,0x0,0x0,0x3,0x3,0x3,0x3,0x2,0x2,0x2,0x2
  15.                               ,0x8,0x8,0x8,0x8,0xF,0xF,0xF,0xF,0xE,0xE,0xE,0xE,0x9,0x9,0x9,0x9
  16.                               ,0x7,0x7,0x7,0x7,0xA,0xA,0xA,0xA,0x5,0x5,0x5,0x5,0x4,0x4,0x4,0x4
  17.                               ,0x2,0x2,0x2,0x2,0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x3,0x3,0x3,0x3
  18.                               ,0x9,0x9,0x9,0x9,0xC,0xC,0xC,0xC,0xF,0xF,0xF,0xF,0xE,0xE,0xE,0xE
  19.                               ,0x4,0x4,0x4,0x4,0xB,0xB,0xB,0xB,0xA,0xA,0xA,0xA,0x5,0x5,0x5,0x5
  20.                               ,0x3,0x3,0x3,0x3,0x6,0x6,0x6,0x6,0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0
  21.                               ,0xE,0xE,0xE,0xD,0xD,0xD,0xD,0xC,0xC,0xC,0xC,0xF,0xF,0xF,0xF,0xE
  22.                               ,0x5,0x5,0x5,0x8,0x8,0x8,0x8,0xB,0xB,0xB,0xB,0xA,0xA,0xA,0xA,0x5};
  23.     for(i=0;i<1;i=i){
  24.         cin >> hex >> z;
  25.         i1=z;
  26.         cin >> hex >> z;
  27.         i2=z;
  28.         cin >> hex >> z;
  29.         i3=z;
  30.         cin >> hex >> z;
  31.         i4=z;
  32.         o4=T1[i4]^T2[i2][i1];
  33.         cout << hex << (int)o4 << endl;
  34.         cin.get();
  35.     }
  36.     return 0;
  37. }


добавил:
Сделал тоже самое с третим нибблом:
Code:
  1. CDEF89AB45670123
  2.  
  3. 0DA7C963852F41EB
  4. 1EB0C963963852F4
  5. 1EB0DA7C963852F4
  6. 1EB0DA7C963852F4
  7. 2F41DA7C96386385
  8. 2F41EB0DA7C96385
  9. 2F41EB0DA7C96385
  10. 3852EB0DA7C96385
  11. 3852F41EB0DA7C96
  12. 3852F41EB0DA7C96
  13. 3852F41EB0DA7C96
  14. C963852F41EB0DA7
  15. C963852F41EB0DA7
  16. C963852F41EB0DA7
  17. DA7C963852F41EB0
  18. DA7C963852F41EB0

Код который генерирует два последних ниббла:
Code:
  1. #include <iostream>
  2. using namespace std;
  3. int main(int argc, char *argv[]){
  4.     int i,z;
  5.     unsigned char i1,i2,i3,i4,o1,o2,o3,o4;
  6.     unsigned char T1[16]={0xD,0xC,0xF,0xE,0x9,0x8,0xB,0xA,0x5,0x4,0x7,0x6,0x1,0x0,0x3,0x 2};
  7.     unsigned char T2[16][16]={0x0,0x0,0x0,0x0,0x7,0x7,0x7,0x7,0x6,0x6,0x6,0x6,0x1,0x1,0x 1,0x1
  8.                               ,0xF,0xF,0xF,0xF,0x2,0x2,0x2,0x2,0xD,0xD,0xD,0xD,0xC,0xC,0xC,0xC
  9.                               ,0xA,0xA,0xA,0xA,0x9,0x9,0x9,0x9,0x8,0x8,0x8,0x8,0xB,0xB,0xB,0xB
  10.                               ,0x1,0x1,0x1,0x1,0x4,0x4,0x4,0x4,0x7,0x7,0x7,0x7,0x6,0x6,0x6,0x6
  11.                               ,0xC,0xC,0xC,0xC,0x3,0x3,0x3,0x3,0x2,0x2,0x2,0x2,0xD,0xD,0xD,0xD
  12.                               ,0xB,0xB,0xB,0xB,0xE,0xE,0xE,0xE,0x9,0x9,0x9,0x9,0x8,0x8,0x8,0x8
  13.                               ,0x6,0x6,0x6,0x6,0x5,0x5,0x5,0x5,0x4,0x4,0x4,0x4,0x7,0x7,0x7,0x7
  14.                               ,0xD,0xD,0xD,0xD,0x0,0x0,0x0,0x0,0x3,0x3,0x3,0x3,0x2,0x2,0x2,0x2
  15.                               ,0x8,0x8,0x8,0x8,0xF,0xF,0xF,0xF,0xE,0xE,0xE,0xE,0x9,0x9,0x9,0x9
  16.                               ,0x7,0x7,0x7,0x7,0xA,0xA,0xA,0xA,0x5,0x5,0x5,0x5,0x4,0x4,0x4,0x4
  17.                               ,0x2,0x2,0x2,0x2,0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x3,0x3,0x3,0x3
  18.                               ,0x9,0x9,0x9,0x9,0xC,0xC,0xC,0xC,0xF,0xF,0xF,0xF,0xE,0xE,0xE,0xE
  19.                               ,0x4,0x4,0x4,0x4,0xB,0xB,0xB,0xB,0xA,0xA,0xA,0xA,0x5,0x5,0x5,0x5
  20.                               ,0x3,0x3,0x3,0x3,0x6,0x6,0x6,0x6,0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0
  21.                               ,0xE,0xE,0xE,0xD,0xD,0xD,0xD,0xC,0xC,0xC,0xC,0xF,0xF,0xF,0xF,0xE
  22.                               ,0x5,0x5,0x5,0x8,0x8,0x8,0x8,0xB,0xB,0xB,0xB,0xA,0xA,0xA,0xA,0x5};
  23.     unsigned char T3[16]={0xC,0xD,0xE,0xF,0x8,0x9,0xA,0xB,0x4,0x5,0x6,0x7,0x0,0x1,0x2,0x 3};
  24.     unsigned char T4[16][16]={0x0,0xD,0xA,0x7,0xC,0x9,0x6,0x3,0x8,0x5,0x2,0xF,0x4,0x1,0x E,0xB
  25.                               ,0x1,0xE,0xB,0x0,0xC,0x9,0x6,0x3,0x9,0x6,0x3,0x8,0x5,0x2,0xF,0x4
  26.                               ,0x1,0xE,0xB,0x0,0xD,0xA,0x7,0xC,0x9,0x6,0x3,0x8,0x5,0x2,0xF,0x4
  27.                               ,0x1,0xE,0xB,0x0,0xD,0xA,0x7,0xC,0x9,0x6,0x3,0x8,0x5,0x2,0xF,0x4
  28.                               ,0x2,0xF,0x4,0x1,0xD,0xA,0x7,0xC,0x9,0x6,0x3,0x8,0x6,0x3,0x8,0x5
  29.                               ,0x2,0xF,0x4,0x1,0xE,0xB,0x0,0xD,0xA,0x7,0xC,0x9,0x6,0x3,0x8,0x5
  30.                               ,0x2,0xF,0x4,0x1,0xE,0xB,0x0,0xD,0xA,0x7,0xC,0x9,0x6,0x3,0x8,0x5
  31.                               ,0x3,0x8,0x5,0x2,0xE,0xB,0x0,0xD,0xA,0x7,0xC,0x9,0x6,0x3,0x8,0x5
  32.                               ,0x3,0x8,0x5,0x2,0xF,0x4,0x1,0xE,0xB,0x0,0xD,0xA,0x7,0xC,0x9,0x6
  33.                               ,0x3,0x8,0x5,0x2,0xF,0x4,0x1,0xE,0xB,0x0,0xD,0xA,0x7,0xC,0x9,0x6
  34.                               ,0x3,0x8,0x5,0x2,0xF,0x4,0x1,0xE,0xB,0x0,0xD,0xA,0x7,0xC,0x9,0x6
  35.                               ,0xC,0x9,0x6,0x3,0x8,0x5,0x2,0xF,0x4,0x1,0xE,0xB,0x0,0xD,0xA,0x7
  36.                               ,0xC,0x9,0x6,0x3,0x8,0x5,0x2,0xF,0x4,0x1,0xE,0xB,0x0,0xD,0xA,0x7
  37.                               ,0xC,0x9,0x6,0x3,0x8,0x5,0x2,0xF,0x4,0x1,0xE,0xB,0x0,0xD,0xA,0x7
  38.                               ,0xD,0xA,0x7,0xC,0x9,0x6,0x3,0x8,0x5,0x2,0xF,0x4,0x1,0xE,0xB,0x0
  39.                               ,0xD,0xA,0x7,0xC,0x9,0x6,0x3,0x8,0x5,0x2,0xF,0x4,0x1,0xE,0xB,0x0};
  40.     for(i=0;i<1;i=i){
  41.         cin >> hex >> z;
  42.         i1=z;
  43.         cin >> hex >> z;
  44.         i2=z;
  45.         cin >> hex >> z;
  46.         i3=z;
  47.         cin >> hex >> z;
  48.         i4=z;
  49.         o3=T3[i3]^T4[i2][i1];
  50.         o4=T1[i4]^T2[i2][i1];
  51.         cout << hex << (int)o3 << (int)o4 << endl;
  52.         cin.get();
  53.     }
  54.     return 0;
  55. }


Слишком большой код получился, тот что я выше подобрал попроще будет. Вся загвоздка в этих таблицах, они не идеально симметричны. Кое где сдвиги и дефекты из-за которых я не могу понять как разбить на две строки .

С первыми двумя нибблами вообще у меня тоже самое не получается, то ли я не неправильно строю для них пространство. Как не пробывал проксорить, не получаются таблицы с одним элементом =(.


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

Создано: 30 ноября 2010 06:23 New!
Цитата · Личное сообщение · #8

V1KT0P пишет:
Проксорил таблицу 00 с остальными


Признаться, не понял ваш метод - не вижу разделения переменных. Может быть вам стоит приложить к сообщению эташ с таблицами и комментариями - будет проще понять, как именно было сделано?

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

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

Создано: 30 ноября 2010 11:39 New!
Цитата · Личное сообщение · #9

gazlan Кстати заметил, у первого и второго ниббла таблицы по диагонали совпадают о_О. А также структура таблицы одинакова, особенно хорошо видно при сравнении их ксоров.
Жесть, только что заметил охрененную закономернусть между ксором пространства первого и второго ниббла. Щас мне уже на пары надо, но вечером думаю я смогу табличным методом создать алгоритм генерации первого и второго ниббла. Отличия там будут только в изначальном массиве, который я думаю также как и с первым можно сгенерировать конгруэнтным генератором.

{ Атач доступен только для участников форума } - Tables.7z

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

Создано: 30 ноября 2010 17:51 New!
Цитата · Личное сообщение · #10

shved Можно узнать разрядность программатора и контроллера? И вообще что за контроллер, может в инете можно узнать какой там алгоритм. А ключ подобрать к алгоритму это дело времени, в данном случае оно мало.

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

Создано: 30 ноября 2010 20:00 · Поправил: Модератор New!
Цитата · Личное сообщение · #11

Контроллер Сименс. А что там внутри него я не знаю, скорее всего на сименсовском ядре С16х, и программатор Сименс, что в нутри тоже не знаю т.к. на нем пломбы стоят. В инете алгоритма нету как и описания самого протокола.
Разрядность 16 бит

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

Создано: 1 декабря 2010 02:33 New!
Цитата · Личное сообщение · #12

Зашел в тупик. В аттаче таблица из которой спокойно строится первый и второй ниббл. Также там та же таблица из которой убрана каждая вторая строка ибо они повторяются.
gazlan Что посоветуешь?

{ Атач доступен только для участников форума } - nibbl_2_xor2.7z

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

Создано: 1 декабря 2010 13:08 New!
Цитата · Личное сообщение · #13

В упрощенной таблице строки повторяются по многу раз. Например первая 3210FEDCBA987654 повторяется по всей таблице 48 раз, некоротые повторяются 52 раза... О чем это говорит?

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

Создано: 1 декабря 2010 13:23 · Поправил: V1KT0P New!
Цитата · Личное сообщение · #14

shved Если сделать тупо через эти массивы то это помоему займет примерно 2,5-3 кб. Сколько можно выделить памяти для алгоритма? тебя это устроит? Просто я уже не знаю за что ухватиться.

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

Создано: 1 декабря 2010 14:49 New!
Цитата · Личное сообщение · #15

Сейчас попробую твой алгоритм запихнуть в АВР и скажу сколько займет. Но думаю маловато места для моих подпрограмм останется, думаю таблицы много займут. На крайний случай реализую на другом мк этой серии с большим объемом ром памяти.

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

Создано: 1 декабря 2010 16:53 New!
Цитата · Личное сообщение · #16

shved Щас пересчитал, получается что таблицы займут ровно 1280 байт, это если я не запутался. Из этих таблиц путем простого ксора получается полная таблица второго ниббла, а ксор второго ниббла с двум значениями младших нибблов дают первый ниббл. Ты же пишешь как минимум на 8 битном проце? Не на 4 битном?


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

Создано: 1 декабря 2010 17:03 · Поправил: gazlan New!
Цитата · Личное сообщение · #17

V1KT0P пишет:
Что посоветуешь?


Признаться, ничего еще не успел посмотреть, занят был другими делами, но, на мой, взгляд, ситуация выглядит так:

1. Прежде всего, стоило бы, конечно, доказать основное утверждение о независимости нибблов - на нем базируется все остальное. Ортогональность пространства запросов очевидна (как следствие полноты - 64 K). Достаточно показать, что пространство ответов изоморфно с ним (т.е. не содержит неуникальных ответов). Не проверял, но это должно быть так.

2. Если есть какой-либо метод, работающий, скажем, для младшего ниббла, то он же, в силу изоморфности пространства состояний, пригоден и для любого другого ниббла.

3. Стобцы (строки) матрицы запросов (4*(16*256)) можно переставлять между собой как угодно (менять нибблы местами), при соответствующей перестановке в матрице ответов (это равносильно просто изменению порядка сортировки карты (MAP) от TC).


Короче говоря, если что-то работает для 16 таблиц первого ниббла, то пересортировав исходный массив, получим такой же набор таблиц (но не значений в них) для второго итд.
Осталось применить к ним этот же метод повторно.

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

Создано: 1 декабря 2010 17:16 New!
Цитата · Личное сообщение · #18

V1KT0P пишет:
а ксор второго ниббла с двум значениями младших нибблов дают первый ниббл.

допустим для пары запрос-ответ должен быть такой результат 0000 -> 33CD
По твоему алоритму я посчитал два самых младших ниббла "C" и "D", теперь мне не понятно
че дальше делать, можешь пример набросать? как мне вотрую половину получить, которая "33"

V1KT0P пишет:
Ты же пишешь как минимум на 8 битном проце?

Да на 8 битном, но на языке высоко уровня, не на асме.

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

Создано: 1 декабря 2010 17:21 New!
Цитата · Личное сообщение · #19

gazlan На первой странице ToBad выложил файл где ответ отсортирован по возрастанию, повторов там нету.
Когда смотришь ксор первого и второго ниббла видно что там если как-то переставить то будет тоже что и с младшими нибблами, но я и так и сяк сортировал ничего нормального получить не смог =(.

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

Создано: 1 декабря 2010 17:23 · Поправил: shved New!
Цитата · Личное сообщение · #20

ой, пардон. торможу дико, разобрался сам.

бля. нихрена не разобрался... не выходит. Т.е. получается что еще 4 таблицы строить не нужно? Все 4 ниббла считаются по этим 4-м массивам?

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

Создано: 1 декабря 2010 17:33 New!
Цитата · Личное сообщение · #21

shved Щас погоди, я щас вторую таблицу получу и выложу.

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

Создано: 1 декабря 2010 20:56 · Поправил: V1KT0P New!
Цитата · Личное сообщение · #22

shved Все-таки 3,2 кб получилось в итоге . Проверил все комбинации, работает. Переменные с и d это переставленные местами нибблы, ибо при генерации таблицы я неправильно поставил их места. А переделывать неохота и так запарился с этими таблицами...

{ Атач доступен только для участников форума } - generate.7z

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

Создано: 2 декабря 2010 02:52 New!
Цитата · Личное сообщение · #23

а можно каким-нибудь образом урезать таблицы, чтобы получать только два самых старших ниббла?
т.е. к примеру для пары 0000-33CD высчитывать только "33".
просто памяти много занимает код. два младших ниббла отлично генерируются по формуле с первой страницы...

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

Создано: 2 декабря 2010 16:07 New!
Цитата · Личное сообщение · #24

shved В коде таблицы урезаны до одного ниббла. Из него генерируется ксором второй. Младшие вычисляются по той простой формуле.
<< . 1 . 2 .
 eXeL@B —› Основной форум —› Расшифровка алгоритма шифрования микропроцессорного устройства

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS