Ein paar Informationen zu dem Funkprotokoll des Schlüssels:
Signal Sender: 433 MHz bzw. 315 MHz, OOK moduliert, Differentieller Manchester-Code (Biphase–Mark) mit 512 bit/s.
Insgesamt 55 Bits unmittelbar nach Tastendruck, dann Wiederholung der ersten 15 Bits alle 39 ms bis die Taste losgelassen wird.
Beispiel (MSB zuerst, das fehlende LSB des letzten Bytes ist 0):
1 |
6B 04 04 10 22 7F CF
|
2 |
6B 04
|
3 |
39 ms 6B 04
|
4 |
39 ms ...
|
Beispiel für mehrmals senden (ohne die 15 Bits Wiederholung):
1 |
Fahrzeug Öffnen
|
2 |
|
3 |
6B 04 04 10 22 7F CF
|
4 |
6C 04 04 1B 22 B7 13
|
5 |
6D 04 04 13 22 B4 F7
|
6 |
6E 04 04 1C 22 28 FE
|
7 |
6F 04 04 1C 22 5E 5C
|
8 |
|
9 |
Fahrzeug schließen
|
10 |
|
11 |
70 08 08 19 22 ED 43
|
12 |
71 08 08 18 22 53 24
|
13 |
72 08 08 1A 22 2E FF
|
14 |
73 08 08 10 22 28 A1
|
15 |
74 08 08 1B 22 8C D4
|
Zur Bedeutung der Bytes:
1 |
Byte 0: "Sequence Counter" (0x00...0xFF)
|
2 |
|
3 |
Byte 1...4: High Nibble: für "Rolling Code Time" (Bit 17...Bit 2)
|
4 |
Byte 4: Bit 1...0 : für "Rolling Code Time" (Bit 1...Bit 0)
|
5 |
"Rolling Code Time" im Beispiel 0x4A. Die "Rolling
|
6 |
Code Time" wird ca. alle sechs Sekunden hochgezählt.
|
7 |
|
8 |
Byte 4: Bit 3...2: Bedeutung unbekannt (vielleicht
|
9 |
Batteriestatus ?)
|
10 |
|
11 |
Byte 1...2: Low Nibble für die Taste (4: Öffnen, 8: Schließen,
|
12 |
2: Bedeutung unbekannt, alles andere vermutlich nicht
|
13 |
verwendet)
|
14 |
|
15 |
Byte 3: Low Nibble: für "Sender ID" (32 Bits) Bits 0..2 des
|
16 |
"Sequence Counter" bestimmen welches 4 Bits es sind
|
17 |
"Sender ID" im Beispiel: 0xCC 0x3B 0x0A 0x89
|
18 |
|
19 |
Byte 5...6: Prüfbits (15 Bits) zur Prüfung der gesendeten Daten
|
Noch mal kurz zur "Rolling Code Time": das ist tatsächlich eine Zeit, der ASIC/Custom Chip im Schlüssel wird dauerhaft von der Batterie versorgt und der 32.768 kHz Quarz schwingt auch wenn keine Taste gedrückt wird. Die Zeit im Beispiel ist so klein weil der Schlüssel erst kurz vor dem Mitschnitt mit Spannung versorgt wurde.
Die Berechnung der Prüfbits (15 Bits) erfolgt durch einen selbst gebastelten Algorithmus. Für die Berechnung werden Daten verwendet, die beim Anlernen eines Funkschlüssels ermittelt werden, sowie von den gesendeten Daten lediglich der "Sequence Counter" (8 Bits). Es werden die Prüfbits für alle angelernten Schlüssel (maximal 4) ermittelt, anhand der passenden Prüfbits weiß man dann welcher Schlüssel gesendet hat. Anhand der "Rolling Code Time" wird geprüft ob der Funkschlüssel synchron zur dazugehörigen Zeit im Fahrzeug ist (mit einer gewissen Toleranz) und nur dann eine Aktion ausgeführt.
Beim Anlernen eines Funkschlüssels muss 8 mal gesendet werden, daraus wird die "Sender ID" bestimmt. Aus der "Sender ID" werden mit einem selbst gebastelten Algorithmus 64 Bytes berechnet und im EEPROM des Mikrocontrollers abgespeichert, diese Daten werden für die Berechnung der Prüfbits des jeweiligen Schlüssels verwendet.
Anhand der Beschreibung sollte klar sein wie schlecht und unsicher das Ganze gemacht ist, auch mit selbst gebastelten Algorithmen könnte man es deutlich besser machen.
Wer sich für die Algorithmen interessiert findet sie in der Firmware. Kleiner Tipp: Es gibt eine Funktion für beide Algorithmen (Berechnen der Daten beim Anlernen und Prüfbits berechnen), diese Funktion muss mehrfach aufgerufen werden bis die jeweilige Berechnung fertig ist. Dadurch wird erreicht dass einzelne Aufgaben ("Tasks") nicht zu lange brauchen, dafür muss man dann aber die "Tasks" entsprechend aufbauen dass sie aus einzelnen Teilen bestehen, die nicht zu viel Rechenzeit verbrauchen.