Checksumme herausfinden/entschlüsseln

Hallo Leute,

habe ein Problem, welches nicht direkt mit dem Arduino zusammenhängt, aber vielleicht kann mir dennoch jemand weiterhelfen...

Ich habe zwei Steuergeräte, welche über CAN-Bus kommunizieren. Ich möchte mich nun mit dem Arduino dazwischenklemmen und ein paar Daten "verfälschen". Das Problem hierbei ist, das die Daten mit Hilfe einer Checksumme überprüft werden und mir nicht klar ist, wie diese Checksumme berechnet wird.

Es sieht eigentlich ganz einfach aus:

  • 8 Datenbytes (extended CAN-Botschaft)
  • Im zweitletzten Byte (von rechts) wird ein Message-Counter verwendet, d.h. ein Zähler der von 0...F hochzählt
  • Im letzten Byte befindet sich dann die Checksumme

Ich weiß nicht, ob alle 7 Bytes zur Berechnung herangezogen werden. Habe auch schon ein paar Online CRC Checksummen Rechner ausprobiert, bin aber nicht weiter gekommen. Hat jemand eine Idee, wie die Checksumme berechnet sein könnte oder einen Rat, wie ich das entschlüsseln könnte?

11 00 A8 61 00 00 01 2B
11 00 A8 61 00 00 11 19
11 00 A8 61 00 00 21 4F
11 00 A8 61 00 00 31 7D
11 00 A8 61 00 00 41 E3
11 00 A8 61 00 00 51 D1
11 00 A8 61 00 00 61 87
11 00 A8 61 00 00 71 B5
11 00 A8 61 00 00 81 20
11 00 A8 61 00 00 91 12
11 00 A8 61 00 00 A1 44
11 00 A8 61 00 00 B1 76
11 00 A8 61 00 00 C1 E8
11 00 A8 61 00 00 D1 DA
11 00 A8 61 00 00 E1 8C
11 00 A8 61 00 00 F1 BE
...
11 00 A8 61 00 00 01 2B
11 00 A8 61 00 00 11 19
11 00 A8 61 00 00 21 4F
11 00 A8 61 00 00 31 7D
usw.

Und einfach XOR der 7 Bytes machen?

Das Programm "reveng" findet mehrere Möglichkeiten bzw. CRC:

C:\Users\Jim\Desktop\Current\reveng-1.3.1>reveng -w 8 -s 1100a8610000012b 1100a8
6100001119 1100a86100214f 1100a8610000317d
width=8  poly=0x9b  init=0x74  refin=false  refout=false  xorout=0xb0  check=0x1
7  name=(none)
width=8  poly=0x9b  init=0xfd  refin=false  refout=false  xorout=0x39  check=0x1
7  name=(none)
width=8  poly=0xf1  init=0x00  refin=true  refout=true  xorout=0xb9  check=0xe1
 name=(none)
width=8  poly=0xf1  init=0xe9  refin=true  refout=true  xorout=0x2e  check=0xe1
 name=(none)
width=8  poly=0xf1  init=0xca  refin=true  refout=true  xorout=0xea  check=0xe1
 name=(none)
width=8  poly=0xf1  init=0x23  refin=true  refout=true  xorout=0x7d  check=0xe1
 name=(none)
width=8  poly=0xf1  init=0x8c  refin=true  refout=true  xorout=0x88  check=0xe1
 name=(none)
width=8  poly=0xf1  init=0x65  refin=true  refout=true  xorout=0x1f  check=0xe1
 name=(none)
width=8  poly=0xf1  init=0x46  refin=true  refout=true  xorout=0xdb  check=0xe1
 name=(none)
width=8  poly=0xf1  init=0xaf  refin=true  refout=true  xorout=0x4c  check=0xe1
 name=(none)

Spexx:
habe ein Problem, welches nicht direkt mit dem Arduino zusammenhängt, aber vielleicht kann mir dennoch jemand weiterhelfen...
Ich habe zwei Steuergeräte, welche über CAN-Bus kommunizieren...

ungeprüft: CAN in Automation (CiA): Cyclic redundancy check (CRC) in CAN frames

Hoffe, dass es hilft.

jremington:
Das Programm "reveng" findet mehrere Möglichkeiten bzw. CRC:

Super, du bist mein Held, mit dem 1. Polynom scheint es tatsächlich zu funktionieren :open_mouth: Bin zwar auch bereits über das Programm gestolpert, hatte es aber nicht zum Laufen bekommen ::slight_smile:

Vielen Dank für die Antworten, jetzt muss ich nur noch herausfinden wie ich mit dem Polynom eine Checksumme berechnen kann, da hilft mir aber sicher auch Google...

Hier ist die AVR Implementierung dazu:

http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html