Так что я застрял
Я недавно купил устройство Bluetooth, которое хорошо взаимодействует с моим телефоном, будучи мной, я хотел написать контроллер с P C, поэтому начал реверс-инжиниринг BT-трафика c. (Для этого нет SDK, компания, которая делает это устройство явно, я могу с этим смириться)
Теперь устройство BT выдает 28 шестнадцатеричных символов в качестве «значения», и декодирование было достаточно простым ( код ниже)
Что я хочу сделать сейчас, так это отменить эту процедуру и кодировать мою собственную, вот где я терплю неудачу.
Как я уже говорил, устройство выдает 28-символьную шестнадцатеричную строку. Декодировать это просто:
import pandas as pd
from data import codes, lookup
pdcolumns = ['a','b','c','d','e','f','g','h']
def mask(string):
struct = {
'a': None,
'b': None,
'c': None,
'd': None
}
nibbles = [2,4,4,6]
code = string[12:] # slice off the first 12 bits, these are an application ID and seemingly irrelevant
offset = 0
for i, key in zip(range(0, len(nibbles)), list(struct.keys())):
current_byte = nibbles[i]
partial = code[offset:(offset + current_byte)]
struct[key] = int(partial, 16) & 0xFF
if key == 'd':
struct['h'] = int(partial, 16) # copy, no mask
offset += current_byte
struct['e'] = struct['d'] - (struct['d'] ^ ((struct['a'] * struct['c'])) & 0xFF)
# breakdown columns
struct['f'] = (struct['d'] ^ (struct['a'] * struct['c']))
struct['g'] = struct['f'] & 0xFF
return struct
transcribed = []
for code in codes:
transcribed.append(mask(code))
df = pd.DataFrame(transcribed, columns=pdcolumns)
ОК, поэтому первые 5 столбцов просты:
- идентификатор последовательности в диапазоне (1 126)
- Контроллер
- Параметр 1
- Параметр 2 (значение)
- Результат
Столбец h - это необработанный результат из шестнадцатеричного столбца, немаскированные столбцы f и g - это столбцы разбивки из уравнение, которое генерирует результат в e
.
пример вывода
| | a | b | c | d | e | f | g | h |
|-----:|----:|----:|----:|----:|----:|-----:|----:|-------:|
| 924 | 21 | 1 | 0 | 51 | 0 | 51 | 51 | 589107 |
| 795 | 19 | 1 | 0 | 190 | 0 | 190 | 190 | 531646 |
| 491 | 111 | 3 | 48 | 249 | 208 | 5161 | 41 | 413945 |
| 1810 | 18 | 2 | 0 | 96 | 0 | 96 | 96 | 548960 |
| 1209 | 52 | 1 | 0 | 67 | 0 | 67 | 67 | 546115 |
| 1054 | 24 | 2 | 0 | 230 | 0 | 230 | 230 | 549606 |
| 1545 | 7 | 1 | 0 | 162 | 0 | 162 | 162 | 539042 |
| 68 | 69 | 3 | 34 | 238 | 42 | 2500 | 196 | 706542 |
| 242 | 116 | 3 | 76 | 220 | 48 | 8876 | 172 | 862684 |
| 1169 | 12 | 3 | 13 | 234 | 116 | 118 | 118 | 626410 |
пример ввода
243c08001812150101100008fd33
243c080018121301011000081cbe
243c080018126f010310300650f9
243c080018121201021000086060
243c080018123401011000085543
243c0800181218010210000862e6
243c0800181207010110000839a2
243c0800181245010310220ac7ee
243c08001812740103104c0d29dc
243c080018120c0103100d098eea
Учитывая, что происходит двоичное маскирование, как можно Я перевернуть это уравнение? Это, вероятно, просто, но я слишком долго смотрел на это.
Примечания:
Столбцы c & d по модулю 4096, поэтому это допустимая замена для 0 Столбец e может быть (не показан) отрицательным числом до -256 - df.sample
не выбрал ни одного в этом раунде
Любой из d, g, h будет приемлемым, особенно если вы можете объяснить шаги
Это не домашний проект или рабочий проект, это побочный проект, где я бью кирпичную стену и мне нужно понять.
Уточнить
Я хочу изменить столбец e
, учитывая только e
, a
и c
, чтобы сделать h
, хотя я приму любой из f
, g
или d
как эти должен быть обратимым