Wie erstelle ich ein sicheres UART-Kommunikationsprotokoll?

8

Ich habe mich gefragt, wie man ein sicheres UART / USB-Kommunikationsprotokoll erstellt. Ich brauche es für die Kommunikation zwischen einem Mikrocontroller und einem PC. Ich habe ~ 10 Befehle und dachte, ich würde 10 separate Bestätigungsbefehle für jeden von ihnen verwenden.

Der Austausch sollte so verlaufen:

  • Der PC sendet einen Weckbefehl über UART
  • µC erkennt, dass der PC angeschlossen ist, und sendet seinen Befehl an den PC, z. 0x01
  • Der PC macht das, worum er gebeten wurde (einige Hardware-Dinge) und antwortet, ~0x01wenn es fertig ist (ich negiere die Zahl, um einen größeren "Abstand" zwischen den beiden Zahlen zu schaffen).
  • µC weiß, dass es gesendet hat 0x01und ~0x01vom PC erwartet . Wenn etwas anderes als ~0x01zurückkommt, weiß der µC, dass ein Fehler aufgetreten ist, und sendet eine neue Anfrage oder eine Fehlermeldung

Der Fall, dass der µC sendet 0x01, der PC versteht 0x02und zurücksendet, ~0x02aber der µC ~0x01aufgrund von Rauschen liest , wäre ziemlich schlecht.

Wie sicher ist das in Bezug auf die Übertragung oder wie kann ich dies sicherer machen?

JavaForStarters
quelle
1
Vielleicht möchten Sie die verwandte Frage von mir und die sehr guten Antworten darauf überprüfen .
Eugene Sh.
1
Mit "sicherer" meinen Sie, dass Sie weniger anfällig für Übertragungsfehler sind, keine Krypto usw. hinzufügen, um dem Abhören zu widerstehen, und was nicht. Auch nur das ist ein ziemlich großes Feld: en.wikipedia.org/wiki/Error_detection_and_correction
Fizz
2
Vielleicht möchten Sie die Hamming-Codierung nachschlagen . Es werden bis zu 16 Befehle (4 Bit) benötigt und systematisch auf 7 Bit erweitert (die über einen Standard-UART übertragen werden können). Sie können einen einzelnen Bitfehler korrigieren oder feststellen, ob zwei Bits falsch empfangen wurden.
Neil_UK
2
1) 7 Bit + ein Paritätsbit ist eine Möglichkeit und es ist einfach. Es werden nicht alle möglichen Fehler abgefangen, sondern viele. 2) Eine robustere Methode besteht darin, zwei Bytes zu senden, erstens mit dem eigentlichen Befehl und zweitens mit dem 'nicht' des ersten Befehls. 3) Noch besser ist es, ein "Kommando-Kommen" -Byte zu senden, gefolgt vom Befehl, gefolgt vom Kompliment des Befehls, gefolgt von einem "Ende des Befehlsbytes". Die Bytes 'Befehl kommt' und 'Befehlsende' sollten so ausgewählt werden, dass sie keine der Befehls- und Komplimentbefehlsbytes überlagern
user3629249
1
Wenn Sie nur 10 Befehle benötigen, können Sie zwei Kopien in jedes Byte (aus Redundanzgründen) plus Paritätsbits einfügen. Oder da Sie einen Symbolraum von 256 Symbolen haben und nur 10 benötigen, können Sie einfach maximal unterschiedliche Symbole auswählen (alle Symbole unterscheiden sich um mehrere Bits) oder nur Symbole mit geraden Zahlen von Einsen und Nullen auswählen. Sie müssen sich sicherlich nicht um Einzelbitfehler kümmern.
Mkeith

Antworten:

1

Ich denke, Sie sollten längere Befehle definieren, einschließlich wahrscheinlich Prüfsumme oder CRC, und auf eine ACK / NACK- oder Fehlerbedingung warten.

Sie können Beispiele aus einfachen Protokollen wie TFTP ( RFC 1350 ) nehmen.

Klopfen
quelle
1

Für eine sichere Kommunikation sollten Sie alle möglichen Threads zu Ihrer Kommunikationsleitung berücksichtigen. Daher müssen Sie festlegen, ob das System von außen zugänglich ist (Systeme von Drittanbietern, z. B. drahtlos).

Im Allgemeinen müssen Sie über die folgenden Themen nachdenken:

  • Wiederholung
  • Kommission
  • Resequenzierung
  • Manipulation
  • verzögern
  • Einfügen
  • Korruption

Standardmaßnahmen gegen Gewinde sind:

  • Sequenzierung oder Zeitstempel
  • Zeitüberwachung
  • eindeutige Quell- und Zielcodes
  • Antwort
  • Identifizierungsvorgang
  • eine Art Prüfsumme, Hash-Code ...
  • Kryprographische Techniken, von denen einige Sie bereits mit Ihrem einfachen Protokoll implementiert haben.
user2572309
quelle