Wie erstelle ich ein sicheres UART-Kommunikationsprotokoll?

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 soll so ablaufen:

  • PC sendet Weckbefehl über UART
  • µC erkennt, dass der PC angeschlossen ist und sendet seinen Befehl an den PC, z.0x01
  • Der PC tut, worum er gebeten wurde (einige Hardware-Sachen) und antwortet mit ~0x01, wenn es fertig ist (ich negiere die Zahl, um einen größeren "Abstand" zwischen den beiden Zahlen zu schaffen).
  • µC weiß, dass er gesendet hat und vom PC 0x01erwartet . ~0x01Wenn etwas anderes als ~0x01zurückkommt, weiß der µC, dass etwas schief gelaufen ist und sendet eine neue Anfrage oder eine Fehlermeldung

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

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

Vielleicht möchten Sie die verwandte Frage von mir und die sehr guten Antworten darauf überprüfen.
Mit "sicherer" meinen Sie weniger anfällig für Übertragungsfehler, kein Hinzufügen von Krypto usw., um dem Abhören zu widerstehen und was nicht. Schon das ist ein ziemlich weites Feld: en.wikipedia.org/wiki/Error_detection_and_correction
Du hast Recht, es klingt etwas verwirrend. Übertragungsfehler natürlich. Ich würde das UART-Paritätsbit aktivieren, da der µC es in Hardware unterstützt und es wirklich schnell sein sollte, aber es ist immer noch etwas unsicher, ob sich durch Rauschen nur die richtigen Bits ändern ...
Vielleicht möchten Sie nach Hamming-Codierung suchen . Es nimmt bis zu 16 Befehle (4 Bits) auf und erweitert sie systematisch auf 7 Bits (die über einen Standard-UART übertragen werden können). Sie können jeden einzelnen Bitfehler korrigieren oder erkennen, ob zwei Bits falsch empfangen wurden.
1) 7 Bit + ein Paritätsbit ist eine Möglichkeit und es ist einfach. Es wird nicht alle möglichen Fehler abfangen, aber viele. 2) Eine robustere Methode besteht darin, zwei Bytes zu senden, zuerst mit dem eigentlichen Befehl und zweitens mit dem 'nicht' des ersten Befehls. 3) Noch besser ist es, ein „command coming“-Byte zu senden, gefolgt von dem Befehl, gefolgt von der Ergänzung des Befehls, gefolgt von einem „end of command“-Byte. Die Bytes 'command coming' und 'end of command' sollten so ausgewählt werden, dass sie sich nicht mit irgendwelchen der Befehls- und Komplement-Befehlsbytes überlagern
Da Sie nur 10 Befehle benötigen, ist Hamming-Code + Paritätsbit ein Kinderspiel.
Hamming kannte ich noch nicht, danke, das klingt wirklich vielversprechend!
Wenn Sie nur 10 Befehle benötigen, können Sie zwei Kopien in jedes Byte (für Redundanz) plus Paritätsbits einfügen. Oder da Sie einen Symbolraum von 256 Symbolen haben und nur 10 benötigen, könnten Sie einfach maximal unterschiedliche Symbole auswählen (alle Symbole unterscheiden sich durch mehrere Bits) oder nur Symbole mit einer geraden Anzahl von Einsen und Nullen auswählen. Sie müssen sich keine Gedanken über Einzelbitfehler machen.
Im Moment wurden einige anständige Gedanken in die Formatierung von Daten gesteckt, aber Sie sollten auch über Sequenzen und Nachrichten nachdenken, die möglicherweise aufgrund von Pufferung verzögert werden - Sie möchten das vielleicht nicht, aber standardmäßig haben Sie es auf der PC-Seite. Da Sie USB (vermutlich USB-verbundene UARTs) erwähnen, denken Sie auch an die Latenz, die zu möglichen Problemen bei der (Neu-)Aufzählung führen kann.
Hamming-Codes sind für die UART-Kommunikation von begrenztem Nutzen, da ein Fehler, der kurz vor dem Start eines Pakets auftritt, dazu führen kann, dass alle nachfolgenden Daten falsch gerahmt werden. Im Allgemeinen kann man sich auch vorstellen, dass, wenn irgendein Teil eines Pakets gestört ist, das gesamte Paket als nutzlos angesehen werden sollte.
Es könnte sich lohnen, sich anzusehen, wie SECS/GEM-Nachrichten zwischen Geräten ausgetauscht werden. Vielleicht kannst du daraus ein paar Ideen stehlen. Sie nehmen das Nachrichtenmanagement und die Genauigkeit ziemlich ernst.

Antworten (2)

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 nehmen ( RFC 1350 )

Für eine sichere Kommunikation sollten Sie alle möglichen Threads zu Ihrer Kommunikationsleitung berücksichtigen. Dazu muss festgelegt werden, ob das System von außen erreichbar ist (Drittanbietersysteme zB WLAN)

Generell muss man an folgende Threads denken:

  • Wiederholung
  • Nachlass
  • Neusequenzierung
  • Manipulation
  • Verzögerung
  • einfügen
  • Korruption

Standardmaßnahmen gegen Fäden sind:

  • Sequenzierung oder Zeitstempel
  • zeitliche Überwachung
  • eindeutige Quell- und Zielcodes
  • Antwort
  • Identifizierungsverfahren
  • eine Art Prüfsumme, Hash-Code ...
  • kryptografische Techniken Einige davon haben Sie bereits mit Ihrem einfachen Protokoll implementiert.