Обратный инжиниринг генерации "контрольной суммы" - PullRequest
2 голосов
/ 13 июля 2020

Я анализировал связь на 230 В и пытался выяснить алгоритм контрольной суммы протокола. Из того, что я узнал, структура связи следующая:

  • Первый блок всегда один и тот же, это должна быть какая-то стартовая структура (910hex)
  • Затем гнездо 5 блоки (каждый по 4 бита) - это фактические данные
  • Последние 8 бит должны быть контрольной суммой

Я не уверен, вычисляется ли контрольная сумма только по данным или стартовой структуре также (это 910h в HEX)

Я приложил несколько коммуникационных сообщений, каждая строка - одно сообщение. Я пробовал такие алгоритмы, как CheckSum8 Xor, CheckSum8 Modulo 256 и CheckSum8 2s Complement; к сожалению, безуспешно.

| Start structure |          Data          | ChkSum |
 00000100100010000 1010 1010 1010 1010 1011 10001100
 00000100100010000 1010 1010 1010 1010 1001 01111100
 00000100100010000 1010 1010 1010 1010 1101 01110010
 00000100100010000 1010 1010 1010 1010 0101 01101110
 00000100100010000 1010 1010 1010 1011 0101 01010110
 00000100100010000 1010 1010 1010 1001 0101 00100110
 00000100100010000 1010 1010 1010 1101 0101 11000110
 00000100100010000 1010 1010 1010 0101 0101 11101000
 00000100100010000 1010 1010 1011 0101 0101 10110100
 00000100100010000 1010 1010 1001 0101 0101 00001100
 00000100100010000 1010 1010 1101 0101 0101 10010010
 00000100100010000 1010 1010 0101 0101 0101 01000000
 00000100100010000 1010 1011 0101 0101 0101 00001010
 00000100100010000 1010 1001 0101 0101 0101 10011110
 00000100100010000 1010 1101 0101 0101 0101 01011000
 00000100100010000 1010 0101 0101 0101 0101 00111010
 00000100100010000 1011 0101 0101 0101 0101 11111110
 00000100100010000 1001 0101 0101 0101 0101 10011000
 00000100100010000 1101 0101 0101 0101 0101 01010100
 00000100100010000 0101 0101 0101 0101 0101 00100010

ОБНОВЛЕНИЕ: Сейчас я добился гораздо большего прогресса, и в настоящее время я больше не уверен, контрольная сумма это или CR C вообще. Я сгенерировал и отправил значение данных от 0 до 34, и система сгенерировала следующие «контрольные суммы»

То, что я узнал до сих пор:

  • Старший полубайт (верхний полубайт) изменяется только каждый раз во второй раз
  • Младший полубайт XORED с 1010, поэтому бит 3 и 1 изменяется (не всегда)
  • Старший полубайт инвертируется каждый второй раз (не всегда )
  • Бит 0 «контрольной суммы» равен всегда 0

Шестнадцатеричный столбец в конце - это значение контрольной суммы в шестнадцатеричном формате

     | Start structure |          Data           | ?ChkSum?   | HEX |
00    00000100100010000 0000 0000 0000 0000 0000   1011 1000    B8
01    00000100100010000 0000 0000 0000 0000 0001   1011 0010    B2
02    00000100100010000 0000 0000 0000 0000 0010   0100 1000    48
03    00000100100010000 0000 0000 0000 0000 0011   0100 0010    42
04    00000100100010000 0000 0000 0000 0000 0100   1011 0110    B6
05    00000100100010000 0000 0000 0000 0000 0101   1011 1100    BC
06    00000100100010000 0000 0000 0000 0000 0110   0100 0110    46
07    00000100100010000 0000 0000 0000 0000 0111   0100 1100    4C
08    00000100100010000 0000 0000 0000 0000 1000   1010 0100    A4
09    00000100100010000 0000 0000 0000 0000 1001   1010 1110    AE
10    00000100100010000 0000 0000 0000 0000 1010   0101 0100    54
11    00000100100010000 0000 0000 0000 0000 1011   0101 1110    5E
12    00000100100010000 0000 0000 0000 0000 1100   1010 1010    AA
13    00000100100010000 0000 0000 0000 0000 1101   1010 0000    A0
14    00000100100010000 0000 0000 0000 0000 1110   0101 1010    5A
15    00000100100010000 0000 0000 0000 0000 1111   0101 0000    50
16    00000100100010000 0000 0000 0000 0001 0000   1000 0000    80
17    00000100100010000 0000 0000 0000 0001 0001   1000 1010    8A
18    00000100100010000 0000 0000 0000 0001 0010   0111 0000    70
19    00000100100010000 0000 0000 0000 0001 0011   0111 1010    7A
20    00000100100010000 0000 0000 0000 0001 0100   1000 1110    8E
21    00000100100010000 0000 0000 0000 0001 0101   1000 0100    84
22    00000100100010000 0000 0000 0000 0001 0110   0111 1110    7E
23    00000100100010000 0000 0000 0000 0001 0111   0111 0100    74
24    00000100100010000 0000 0000 0000 0001 1000   1001 1100    9C
25    00000100100010000 0000 0000 0000 0001 1001   1001 0110    96
26    00000100100010000 0000 0000 0000 0001 1010   0110 1100    6C
27    00000100100010000 0000 0000 0000 0001 1011   0110 0110    66
28    00000100100010000 0000 0000 0000 0001 1100   1001 0010    92
29    00000100100010000 0000 0000 0000 0001 1101   1001 1000    98
30    00000100100010000 0000 0000 0000 0001 1110   0110 0010    62
31    00000100100010000 0000 0000 0000 0001 1111   0110 1000    68
32    00000100100010000 0000 0000 0000 0010 0000   1100 1000    C8
33    00000100100010000 0000 0000 0000 0010 0001   1100 0010    C2
34    00000100100010000 0000 0000 0000 0010 0010   0011 1000    38

UPADTE 2: Я сгенерировал данные, где только один бит структуры данных равен 1

| Dec  | Start structure |          Data           | ?ChkSum?   | HEX |
00      00000100100010000 0000 0000 0000 0000 0000   1011 1000    B8
01      00000100100010000 0000 0000 0000 0000 0001   1011 0010    B2
02      00000100100010000 0000 0000 0000 0000 0010   0100 1000    48
04      00000100100010000 0000 0000 0000 0000 0100   1011 0110    B6
08      00000100100010000 0000 0000 0000 0000 1000   1010 0100    A4
16      00000100100010000 0000 0000 0000 0001 0000   1000 0000    80
32      00000100100010000 0000 0000 0000 0010 0000   1100 1000    C8
64      00000100100010000 0000 0000 0000 0100 0000   0101 1000    58
128     00000100100010000 0000 0000 0000 1000 0000   1001 0110    96
256     00000100100010000 0000 0000 0001 0000 0000   1110 0100    E4
512     00000100100010000 0000 0000 0010 0000 0000   0000 0000    00
1024    00000100100010000 0000 0000 0100 0000 0000   0010 0110    26
2048    00000100100010000 0000 0000 1000 0000 0000   0110 1010    6A
4096    00000100100010000 0000 0001 0000 0000 0000   1111 0010    F2
8192    00000100100010000 0000 0010 0000 0000 0000   0010 1100    2C
16384   00000100100010000 0000 0100 0000 0000 0000   0111 1110    7E
32768   00000100100010000 0000 1000 0000 0000 0000   1101 1010    DA
65536   00000100100010000 0001 0000 0000 0000 0000   0111 1100    7C
131072  00000100100010000 0010 0000 0000 0000 0000   1101 1110    DE
262144  00000100100010000 0100 0000 0000 0000 0000   0111 0100    74
524288  00000100100010000 1000 0000 0000 0000 0000   1100 1110    CE

1 Ответ

2 голосов
/ 09 августа 2020

Думаю, я взломал этот. Вот как это работает:

  1. Начните с ваших 20 входных бит и начального результата выполнения 0b10111000 (0x8B).

  2. Есть постоянная 8-битная маска для каждого из 20 входных битов. Для каждого входного бита со значением 1 вы хотите выполнить XOR текущего текущего результата с 8-битной маской для этого бита.

Решение в C:

const UINT8 bitMasks[20] = {
  0b00001010,
  0b11110000,
  0b00001110,
  0b00011100,
  0b00111000,
  0b01110000,
  0b11100000,
  0b00101110,
  0b01011100,
  0b10111000,
  0b10011110,
  0b11010010,
  0b01001010,
  0b10010100,
  0b11000110,
  0b01100010,
  0b11000100,
  0b01100110,
  0b11011100,
  0b01110110
};

UINT8 ComputeWeirdHash(UINT32 inBits)
{
  UINT8 result = 0b10111000;
  for (i=0; i<20; i++)
  {
    if (inBits & (1L << i))
      result ^= bitMasks[i];
  }
  return result;
}

Теперь, чтобы найти каждое значение bitMask, используйте ввод, где только один бит равен 1. Затем запустите его через свою тестовую систему, чтобы найти 8-битную контрольную сумму. Выполните операцию XOR с нашим начальным значением текущего результата: 0b10111000, чтобы найти значение bitMask.

...