In diesem Schülerprojekt geht es um die Umsetzung einer Peer-to-Peer-Kommunikation zwischen zwei Rechnern innerhalb eines Netzwerkes. Diese wird verschlüsselt und unverschlüsselt in Python implementiert.
Sockets (» Steckdose«) sind Softwareobjekte, die eine bidirektionale Netzwerkkommunikation zwischen Server und Clients ermöglichen. Dabei geht es nicht nur um eine Verbindung von Programmen zum Internet, sondern auch um den internen Datenaustausch zwischen den Programmen. „Bei der Benutzung von Sockets spielt es keine Rolle, ob sich der Zielsocket auf dem eigenen Rechner, auf einem Rechner im lokalen Netzwerk oder auf einem Rechner im Internet befindet.“ [Ernesti und Kaiser] Das Betriebssystem stellt dabei die Sockets bereit und hat die Aufgabe alle benutzten Sockets zu verwalten.
Inhaltsverzeichnis
Abbildungsverzeichnis
1 Grundlagen
1.1 Socket
1.2 Transmission Control Protocol
2 Netzwerkkommunikation
2.1 Unverschlüsselt
2.1.1 Peer-to-Peer Rechnermodell
2.1.2 Implementierung Rechner 1
2.1.3 Implementierung Rechner 2
2.2 Exemplarischer Chat-Verlauf
2.2.1 Rechner 1
2.2.2 Rechner 2
2.3 Verschlüsselt
2.3.1 Theoretische Grundlagen: Asymmetrische Verschlüsselung
2.3.2 Theoretische Grundlagen: RSA-Algorithmus
2.3.3 Schlüsselaustausch
2.3.4 Implementierung
3 Arbeitsprotokoll
4 Literatur
Abbildungsverzeichnis
1 Kommunikation über Sockets
2 Der Verbindungsaufbau zwischen zwei Rechnern über Sockets
3 Das Peer-to-Peer-Konzept in unserer Umsetzung
4 Berechtigung für eingehende Netzwerverbindungen
5 Asymmetrischer Verschlüsselungsprozess
6 Schlüsselaustausch zwischen den Kommunikationspartnern
1 Grundlagen
1.1 Socket
Sockets (dt. » Steckdose«) sind Softwareobjekte, die eine bidirektionale Netzwerkkommunikati- on zwischen Server und Clients ermöglichen. Dabei geht es nicht nur um eine Verbindung von Programmen zum Internet, sondern auch um den internen Datenaustausch zwischen den Pro- grammen. „Bei der Benutzung von Sockets spielt es keine Rolle, ob sich der Zielsocket auf dem eigenen Rechner, auf einem Rechner im lokalen Netzwerk oder auf einem Rechner im Internet befindet.“[4, S. 621] Das Betriebssystem stellt dabei die Sockets bereit und hat die Aufgabe alle benutzten Sockets zu verwalten.
Sie erlauben das plattformunabhängige Lesen und Schreiben von Daten und erleichtern so Softwareentwicklern von Unix- und Windowsprogrammen die Entwicklung von netzwerkfähigen Anwendungen.[8, 9, Vgl.] Die Sockets befinden sich im OSI-Schichtenmodell zwischen der Transport- und der Anwendungsschicht (siehe dazu Abbildung 1).
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 1: Kommunikation über Sockets (Abbildung selbst erstellt [5, Vgl. Folie 8])
In der Abbildung 2 ist der Verbindungsaufbau zwischen zwei Kommunikationspartnern veran- schaulicht. Beide Partner besitzen eine IP-Adresse, über die sie im Internet eindeutig adressierbar sind. Die Kommunikation soll über jeweils einen bestimmten Port ablaufen. Hierfür stellt der erste Partner einen Socket bereit, an den sich der zweite Partner richten kann. Wird die Verbin- dung akzeptiert kann die Kommunikation, wie in Abbildung 2b zu sehen ist, direkt von Port zu Port ablaufen.[6, Vgl.]
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 2: Der Verbindungsaufbau zwischen zwei Rechnern über Sockets. (Abbildung selbst erstellt [6, Vgl.])
Sockets in Python
Das Socket-Modul wird über den Befehl import socket geladen und gehört so zur Standardbibliothek. Es ist das Python-Modul für die standardmäßige Socket API und stellt damit eine Menge Funktionen für die Netzwerkkommunikation bereit.[4, Vgl. S. 620]
1.2 Transmission Control Protocol
Im Internet stehen hauptsächlich zwei Kommunikationsprotokolle zur Verfügung: UDP und TCP, bei denen man unterschiedlich mit Sockets arbeiten muss. Das Transmission Control Protocol (TCP) ist ein grundlegendes verbindungsorientiertes Netzwerkprotokoll, welches im Vergleich zu dem User Datagram Protocoll (UDP) eine eingebaute Fehlerkorrektur (Quittungsbetrieb) besitzt, weshalb es zuverlässiger ist. Das Kommunikationsprinzip basiert dabei auf dem Ver- bindungsaufbau, der Datenübertragung und dem Verbindungsabbau. Verwendung findet es vor allem in HTTP- und FTP-Anwendungen, da es eine gute und sichere Verbindung garantiert.[5, Vgl.]
2 Netzwerkkommunikation
2.1 Unverschlüsselt
Die unverschlüsselte Netzwerkkommunikation ist der erste Teil unseres Projekts. Es geht da- bei darum, ein funktionierendes Kommunikationsskript zu programmieren. Zu Beginn wird das das Peer-to-Peer-Konzept erklärt, um dann die jeweilige Implementierung der Rechner einzeln vorzustellen.
2.1.1 Peer-to-Peer Rechnermodell
Die Peer-to-Peer (P2P) Connection (dt. »Gleichgestellter«, »Ebenbürtiger«) beschreibt allge- mein eine Verbindung zwischen mehreren Computern, bei der alle Rechner gleichberechtigt sind. Jeder Rechner in diesem Netz kann sowohl alle Dienste in Anspruch nehmen, als auch eigene Dienste bereitstellen und kann sich mit jedem weiteren (auch mehreren) Rechner in dem Netz- werk verbinden. Die Daten sind normalerweise auf viele Rechner, also die Nutzer, verteilt. Im Gegensatz zum Client-Server-Modell kommt das Peer-to-Peer-Konzept ohne zentrale Schnitt- stelle, also einen Server, aus.
Abbildung 3 soll die Umsetzung unserer Rechner-Rechner-Verbindung veranschaulichen: Der Rechner 1 erzeugt dabei zuerst einen Verbindungssocket, mit dem sich der Rechner 2 später über die IP-Adresse des ersten Rechners verbinden kann. Der Verbindungssocket dient dabei aus- schließlich zum Aufbau der Verbindung und nicht zur Kommunikation. Mit dem Befehl bind() wird der Verbindungssocket an die Adresse des ersten Rechners gebunden und mit listen() lauscht dieser. Wird die Verbindung, welche der zweite Rechner durch connect() eingehen kann, über accept() vom Rechner 1 angenommen und aufgebaut, wird ein Kommunikations- socket erstellt. Nun können beide Partner kommunizieren und über send() beziehungsweise recv() Nachrichten schreiben und erhalten. Diese Verbindung bleibt bestehen, bis einer der beiden Partner den Kommunikationssocket schließt oder das Programm verlässt. Der Verbin- dungssocket des ersten Rechners bliebt auch nach Ende der Kommunikation noch weiter geöffnet, um weitere Verbindungen eingehen zu können. Das Programm des zweiten Rechners dagegen wird sofort beendet.
2.1.2 Implementierung Rechner 1
Der erste Rechner ist der Kommunikationspartner, welcher als erstes gestartet werden muss, damit ihn der Kommunikationspartner überhaupt adressieren kann. Es handelt sich hierbei um eine serielle Kommunikation. Das heißt, dass die Kommunikation mit einem Partner abgeschlossen sein muss, bevor der erste Rechner eine neue Verbindung starten kann. Außerdem müssen beide Kommunikationspartner um erneut schreiben zu können warten, bis der jeweils andere seine Nachricht gesendet hat, da wir sonst die sogenannte paralle Programmierung benötigen würden. Die Kommunikation findet also nur abwechselnd statt.
Als erstes wird ein Socket erstellt. Mit AF_INET wird die Verwendung des IPv4-Protokolls und mit SOCK_STREAM die Benutzung von TCP für den Socket festgelegt. Anschließend wird er an einen Port gebunden. Die Nummer des Ports muss bei beiden Partnern identisch sein und die Port-Nummer darf nicht von einer anderen Anwendung verwendet werden. So ist der Port 80 beispielsweise grundsätzlich für HTTP-Anwendungen reserviert. Ports ab 49152 sind generell
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 3: Die Peer-to-Peer (P2P) Connection beziehungsweise die Rechner-Rechner- Verbindung (Abbildung selbst erstellt, nach [4, S. 623])
frei verwendbar.[4, Vgl. S. 621] Mit s.listen(1) wird der Rechner 1 in den passiven Modus geschaltet, um so auf eingehende Anfragen zu warten. Der Parameter in der Klammer legt dabei die maximale Anzahl an zu puffernden Verbindungsversuchen fest. Ist dieser Wert kleiner als eins, sind keine Verbindungen möglich.
Um sich zu verbinden benötigt der zweite Rechner die IP-Adresse des Ersten. Aus diesem Grund kann der erste Rechner seine eigene IP-Adresse anzeigen, um diese eventuell an den Partner zu übermitteln. Dazu wird der Unix-Befehl os.popen(" ifconfig |grep inet ") ausgeführt, die Ausgabe eingelesen und verarbeitet. Dieser Befehl gibt unteranderem die eigene IP-Adresse, die des Routers und die Subnetzmaske aus. Möchte der erste Rechner seine IP-Adresse nicht wissen, wird er ohne Ausgabe direkt gestartet.
Der Benutzer gibt nun seinen Namen ein, welcher dem Kommunikationspartner angezeigt wird. Dann wird die Abbruchbedingung für die Verbindung und die Kommunikation initiali- siert, mit der der erste Rechner später das Gespräch beenden kann, da er aus der Endlosschleife herausgeworfen wird. Wenn sich der Rechner 1 entscheidet die Kommunikation zu beenden war- tet er auch nicht mehr auf weitere eingehende Verbindungsversuche, da es bei unserem Projekt nur darum ging eine Netzwerkkommunikation zwischen zwei Partnern umzusetzen.
Nun befindet sich der erste Kommunikationspartner im Verbindungssocket und wartet auf ein- gehende Verbindungen, welche er mit komm, addr = s.accept() akzeptiert. Dabei wird in einem Tupel der Kommunikationssocket, welcher zur Kommunikation mit dem Partner verwendet wird, und das Adressobjekt des Verbindungspartners übergeben.[4, Vgl. S. 627]
Anschließend kann die Kommunikation innerhalb des Kommunikationssockets stattfinden. Der erste Rechner wartet auf eingehende Datenpakete, welche dann ausgegeben werden. Dann kann der Nutzer eine Antwort eingeben, welche dann versendet wird. Möchte der Benutzer des ers- ten Rechners die Konversation beenden muss er nur quit() als Nachricht eingeben. Der erste Rechner übermittelt dann an den Partner, dass die Kommunikation beendet wurde und der Rechner 1 wechselt in den finally Teil des Programms. Der Kommunikations- und der Verbin- dungssocket werden geschlossen und der Nutzer bekommt eine letzte Meldung angezeigt. Der vollständige Code ist im Folgenden dargestellt und steht online zum Download bereit (siehe Literaturverzeichnis1 ).
Abbildung in dieser Leseprobe nicht enthalten
2.1.3 Implementierung Rechner 2
Um mit dem zweiten Rechner unseren Chat nutzen zu können, benötigt man die IP-Adresse des Zielrechners. Der Kommunikationspartner kann sich beispielsweise im lokalen Netzwerk befinden, zwingend notwenig ist aber nur eine Verbindung der beiden Rechner über das Internet.
Zunächst erhält man hier eine Liste aller im Netzwerk vorhandenen Computern und ihrer zughörigen IP-Adressen. Man kann nun eine Adresse auswählen oder manuell eine Adresse eingeben, falls sich der Zielserver nicht im lokalen Netzwerk befindet.
Bei erfolgreicher Eingabe, das heißt die IP des gewünschten Partners ist erreichbar und das Prgramm Rechner1.py läuft, wird beim zweiten Rechner ebenfalls ein Socket mit den gleichen Eigenschaften (IPv4 und TCP) wie beim Rechner zuvor erstellt. Mit dem Befehl s.connect((ip,50000)) wird eine Verbindung zum Kommunikationspartner aufgebaut. Wie bereits beschrieben, muss hier die IP-Adresse bekannt sein, sowie beide Partner auf den gleichen Port eingestellt sein.
Nachdem die Verbindung mit dem Partner aufgebaut wurde, muss der Benutzer einen Namen eintragen, welcher jeder Nachricht vorangestellt wird. Es wird mit quitRechner2=False noch eine Abbruchbedingung eingeführt.
Nun beginnt die eigentliche Kommunikation. Der Nutzer des zweiten Rechners gibt seine Nachricht, welche im Folgenden noch mit seinem Namen versehen wird, ein und diese wird dann mit s.send() an den verbundenen Partner gesendet. Dann wartet der erste Rechner auf eine Antwort des Zweiten und gibt diese bei Erhalt aus.
Wenn als Nachricht quit() eigegeben wird, beendet der zweite Rechner die Kommunikation durch die Abbruchbedingung und infolgedessen wird die Verbindung zum Kommunikationspart- ner beendet.
Abbildung in dieser Leseprobe nicht enthalten
[...]
- Arbeit zitieren
- Florian Wolf (Autor:in), Jonas Martin (Autor:in), 2017, Implementierung einer verschlüsselten Netzwerkkommunikation unter der Verwendung von Python Sockets und des RSA-Algorithmus, München, GRIN Verlag, https://www.grin.com/document/372474
-
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen.