Beispiel: AES256 Bit Verschlüsselte Übertragung mit CRC8, Seriell, Ethernet, ...

Hi, dieses Beispiel ist für diejenigen von euch sinnvoll die:

    • eine Übertragung zwischen zwei Arduinos realisieren wollen
    • eine Übertragung zwischen einem Arduino und einem Webserver (PHP5) realisieren wollen
    • eine Hausautomatisierung basteln welche einen Webserver verwendet um z.B: ein Rechte System mit Hilfe einer Datenbank umzusetzen

Verschlüsseln von Daten in der heutigen Zeit ist immer wichtiger. Man sollte sich keine eigene Verschlüsslung oder Verschiebung von Bytes ausdenken, diese Verschachtelungen lassen sich mit einfachen Mitteln meistens schnell umgehen und können in keinem Fall als sicher bezeichnet werden.

Es gibt heutzutage getestet Algorithmen die für Sicherheit garantieren. Dazu zählt z.B: AES (mehr dazu bei Wikepedia).

Im Arduino ist meistens gefühlt zu wenig Speicher vorhanden, somit lassen sich keine komplexeren Webseiten realisieren. Aus diesem Grund verwende ich einen externen Webserver der entweder irgendwo im Internet steht oder z.B. auf einem Raspberry Pi läuft (sehr geringe Energieaufnahme). Da die Übertragung der Datenpakete normalerweise im Klartext läuft und leicht mit Wireshark (illegale Software die im Netzwerk Datenpakete anzeigt) ausgelesen kann, stellt dies für Hacker die einen Router anzapfen auch kein Problem dar. Desweiteren ist es möglich die Datenpakete im Internet zu Manipulieren und an die Ip-Adresse des Arduino zu schicken.

Aus diesem Grund sollte die Übertragung verschlüsselt werden.

Das Beispiel im Anhang beinhaltet den PHP Code der auf dem Apache Server läuft, sowie eine AES Library die ich im Internet gefunden habe. Die Quelle werde ich nachliefern. Zudem befindet sich ein Beispiel Sketch in dem Archiv.

Das Beispiel stellt eine Verbindung zwischen einem Arduino und einem Apache Server her. Die Verbindung wird mit AES 256 Bit verschlüsselt. Die Daten werden mit einem CRC8 verglichen, so dass wenn der falsche Schlüsselt verwendet wurde, oder die Übertragung einen Bit Fehler hat, dies zuverlässig erkannt werden kann.
Bei der AES Verschlüsslung wird Blockweise (16 Bytes) verschlüsselt. im Letzten Byte wird immer der CRC abgespeichert. Die Funktionen die die "Cipher" generieren sind so ausgelegt das minimal 15 Bytes und maximal 63 Bytes an Daten übertragen werden können, je nach länge der vorhandenen Daten wird die "Cipher" mit 16 / 32 /48 /64 Byte generiert.
Damit die Daten anschließend übertragen werden können wird aus den Bytes eine char Hex String generiert der dann über die Schnittstelle übertragen wird.

Da die Socket Verbindung in PHP auf dem Webserver sich befindet, ist es nur möglich Daten kurz nacheinander zu senden und zu empfangen. Aus diesem Grund ist das Beispiel so aufgebaut, das zuerst Daten vom Webserver empfangen werden, diese dann kurz verarbeitet werden und anschließen direkt Daten gesendet werden. Sobald die Webseite im Server Angezeigt wird, werden die Daten die vom Arduino geschickt werden im Fenster angezeigt.
Auf dem Arduino werden über den seriellen Monitor die Daten angezeigt die vom Webserver gesendet wurden.

Der Schlüssel der Übertragung ist 32 Byte lang.

Schaut euch das Beispiel mal an. Wenn Interesse besteht, kann ich aus dem Code eine Lib mit mehreren Beispielen bauen, unter anderem mit einer seriellen Übertragung zwischen zwei Arduinos. Alternative könnte ich für den PHP Code das Beispiel so erweitern das ein Datenbank gestütztes Login + Rechte Verwaltung über einen kleinen Admin Bereich möglich sind. Die Code liegt hier irgendwo noch rum ;.).

Arduino_aes_ethernet_apache_connection.rar (46.6 KB)

Anders kennt man unseren Jomelo nicht, immer fleißig dabei :wink:
Dass mit dem Interesse, login und so, bin ich bestimmt nicht der einzige.
Ich hatte vor für die Hausautomatisierung das login von WordPress zu benutzen.