Posted on Leave a comment

Ein einfaches Programm für eine Verschlüsselung gestalten

Ein einfaches Programm für eine Verschlüsselung gestalten

Wenn Sie die ersten Programmierkenntnisse erworben haben, ist es sehr wichtig, die Fähigkeiten weiter zu trainieren. Indem Sie viele weitere Programme schreiben, verfestigen Sie Ihr Wissen und außerdem lernen Sie viele weitere Funktionen kennen. Darüber hinaus erstellen Sie die entsprechenden Programme von Grund auf selbst. Auch das ist eine wichtige Fähigkeit, die jeder Programmierer benötigt.

Vielen Anfängern fällt es jedoch schwer, eigene Projekte zu entwickeln. Daher unterstützen wir Sie dabei. In diesem Beitrag entwickeln wir ein Programm, das einen Text ver- und entschlüsselt. Zunächst erklären wir dabei genau, welche Aufgaben das Programm erledigen und wie es dabei vorgehen soll. So können Sie auch einmal selbst versuchen, den Code dafür zu erstellen. Sollten Sie dabei jedoch alleine nicht weiterkommen, erklären wir Ihnen anschließend die Vorgehensweise Schritt für Schritt.

Java Kompendium 19.99 € Verfügbar In den Warenkorb

Das Ziel des Programms

Die Datensicherheit spielt eine enorme Bedeutung in der modernen Kommunikation. Auch viele Betriebe sind dazu verpflichtet, ihre Daten in verschlüsselter Form aufzubewahren. Daher ist die Nachfrage nach Fachkräften mit entsprechenden Kenntnissen in der Verschlüsselungstechnik sehr hoch.

An dieser Stelle wollen wir ein einfaches Programm für die Verschlüsselung erstellen. Dieses wird selbstverständlich nicht den heute üblichen Sicherheitsstandards entsprechen. Aber es stellt einen interessanten Einstieg dar und stellt die grundlegende Vorgehensweise vor. Auf diese Weise erhalten Sie einen ersten Einblick in die entsprechenden Aufgaben und außerdem verbessern Sie damit Ihre Programmierkenntnisse.

Das Programm soll mit Dateien arbeiten. Daher wäre es gut, wenn Sie bereits wissen, wie Sie Daten in eine Datei schreiben und wie Sie sie auslesen. Das Programm soll den Anwender nach den Namen der Ausgangs- und der Zieldatei fragen und die Daten dann entsprechend einlesen und abspeichern.

Eine passende Verschlüsselungstechnik auswählen

Wenn Sie ein Programm für die Verschlüsselung eines Texts schreiben, ist es im ersten Schritt notwendig, eine passende Verschlüsselungstechnik auszuwählen. Hierbei besteht eine große Auswahl. Wir wählen für unser Projekt die sogenannte Caesar-Verschlüsselung. Wenn Sie weitergehende Informationen zu dieser Vorgehensweise wünschen, können Sie den folgenden Link aufrufen: https://de.wikipedia.org/wiki/Caesar-Verschl%C3%Bcsselung.

Diese Verschlüsselungsmethode bietet den Vorteil, dass sie sehr leicht zu verstehen ist. Auch die Umsetzung ist einfach. Daher eignet sie sich hervorragend für ein Programm für Anfänger. Allerdings bietet sie den Nachteil, dass sie ausgesprochen unsicher ist. Das macht es leicht, den Code zu knacken. Daher sollten Sie das Programm, das wir hier entwickeln, besser nicht für geheime Dokumente verwenden. Es dient lediglich zu Übungszwecken. Dennoch können Sie beispielsweise private Schriftstücke damit so gestalten, dass ihr Inhalt nicht auf den ersten Blick klar wird.

Die Caesar-Verschlüsselung besteht darin, die einzelnen Buchstaben im Alphabet weiter nach hinten zu verschieben. Der römische Feldherr Gaius Julius Caesar, auf den der Name dieser Verschlüsselungstechnik zurückgeht, verwendete diese Technik für die Übermittlung militärischer Nachrichten. Er wählte hierbei für die Verschiebung stets einen festen Wert. Er verschob alle Buchstaben um drei Positionen. Aus A wurde demnach D, aus F wurde I und aus S wurde V (Diese Umwandlungen entsprechen allerdings dem heutigen Alphabet. Die alten Römer verwendeten ein Alphabet mit einer anderen Reihenfolge.)

Die Umwandlung erfolgt hierbei zyklisch. Das bedeutet, dass wenn das Ende des Alphabets erreicht ist, wieder der erste Buchstabe eingesetzt wird. Das heißt beispielsweise, dass das X zu einem A und das Z zu einem C wird.

Für unser Programmbeispiel erweitern wir diese Technik jedoch in einigen Bereichen. Zum einen fragen wir vom Anwender einen Code ab. Dabei handelt es sich um eine Zahl, die die Größe der Verschiebung angeben soll. Indem wir hierfür keinen festen Wert verwenden, erhöhen wir die Sicherheit etwas. Außerdem nehmen wir auch Umlaute und das Eszett auf. Diese fügen wir am Ende an das Alphabet an. Aus dem Buchstaben X wird dann nicht wie bei der Verwendung des einfachen Alphabets der Buchstabe A, sondern Ä. Den Buchstaben Z wandeln wir in ein Ü um – immer vorausgesetzt, dass wir mit einer Verschiebung um drei Positionen arbeiten.

Eine geeignete Programmiersprache auswählen

Nun müssen wir noch eine passende Programmiersprache auswählen. Dabei sind wir in unserer Auswahl jedoch fast vollkommen frei. Die Funktionen, die wir hierfür benötigen, stehen in jeder gängigen Programmiersprache zur Verfügung. Wenn Sie gerade selbst dabei sind, das Programmieren zu erlernen, können Sie daher die Sprache auswählen, mit der Sie sich gerade beschäftigen.

In diesem Artikel gestalten wir das Beispielprogramm in der Programmiersprache Java. Dabei handelt es sich jedoch um eine willkürliche Entscheidung. Es wäre auch möglich, es in einer anderen Sprache umzusetzen. Wenn Sie eine andere Sprache vorziehen, stellt das aber ebenfalls kein Problem dar. Die Strukturen sind hierbei identisch. Kleinere Unterschiede bestehen lediglich beim Umgang mit Zeichenketten und bei der Arbeit mit Dateien. Wenn Sie jedoch in Ihrer jeweiligen Programmiersprache bereits über die entsprechenden Kenntnisse verfügen, sollte es kein Problem darstellen, anhand der hier vorgestellten Strukturen das Programm in eine andere Sprache zu übertragen.

Der Aufbau des Programms

Bevor wir mit dem Programmieren beginnen, müssen wir uns noch einige Gedanken über den Aufbau des Programms machen. Hierbei wollen wir mit Methoden arbeiten. Diese sollen die einzelnen Teilaufgaben erledigen. Das Hauptprogramm definiert lediglich die Arrays mit den einzelnen Buchstaben, die wir später für die Verschlüsselung benötigen. Außerdem fragt es den Anwender, ob er die Datei verschlüsseln oder entschlüsseln will. Darüber hinaus fordert es ihn zur Eingabe eines Codes auf. Danach ruft es lediglich die entsprechenden Methoden für das Verschlüsseln und das Entschlüsseln auf.

Die Methoden verschlüsseln() und entschlüsseln() benötigen jedoch noch einige Hilfs-Methoden. Diese sollen beispielsweise die Dateinamen vom Anwender abfragen, die Daten aus einer Datei auslesen und sie in eine Datei schreiben.

Erstellung der erforderlichen Arrays für Groß- und Kleinbuchstaben

Zunächst müssen wir ein Array erstellen, das alle Buchstaben in der richtigen Reihenfolge enthält. Dieses dient uns später als Hilfsmittel für die Verschlüsselung. Dabei müssen wir den Text mit den im Array enthaltenen Buchstaben vergleichen. Wenn wir eine Übereinstimmung gefunden haben, gelangen wir zu dem für die Verschlüsselung benötigten Buchstaben, indem wir die Position im Array um den vorgegebenen Wert erhöhen.

Hierbei tritt jedoch das Problem auf, dass unser Programm zwischen Groß- und Kleinbuchstaben unterscheidet. Wenn wir in unserem Array nur Kleinbuchstaben verwenden und der Text einen Großbuchstaben enthält, findet unser Programm keine Übereinstimmung. Aus diesem Grund ist es sinnvoll, mit zwei Arrays zu arbeiten – eines für Kleinbuchstaben und eines für Großbuchstaben.

Dabei müssen wir allerdings noch einen weiteren Aspekt berücksichtigen: Das Eszett existiert nicht als Großbuchstabe. Zwar wurde das große Eszett 2017 offiziell in der deutschen Rechtschreibung eingeführt. Java unterstützt diesen Buchstaben jedoch nicht, sodass wir ihn nicht in unserem Programm verwenden können. Wenn wir nun jedoch in beiden Arrays den Kleinbuchstaben verwenden, könnte das dazu führen, dass die Groß- und Kleinbuchstaben vertauscht werden. Das könnte wiederum zur Folge haben, dass ein Text, den wir zunächst verschlüsseln und danach wieder entschlüsseln, orthografische Mängel hinsichtlich der Groß- und Kleinschreibung aufweist. Eine Möglichkeit, um dieses Problem zu beheben, besteht darin, den entsprechenden Buchstaben im Array für die Großbuchstaben wegzulassen. Das würde aber den Aufwand später erhöhen, da wir dann für jedes der beiden Arrays eine gesonderte Schleife mit einer unterschiedlichen Anzahl an Durchläufen erstellen müssten. Um dies zu vermeiden, verwenden wir ein Ersatzsymbol: das Dollarzeichen. Wenn ein Großbuchstabe eigentlich in das Eszett übersetzt werden müsste, verwenden wir stattdessen dieses Symbol. Auf diese Weise entstehen keine Verwechslungen.

Diesen Vorgaben entsprechend erstellen wir nun die beiden Arrays:

In unsere Arrays haben wir keine Ziffern aufgenommen. Das führt dazu, dass diese später in ihrer ursprünglichen Form erhalten bleiben und nicht verschlüsselt werden. Wenn Sie auch Zahlen verschlüsseln wollen, können sie jedoch auch die Ziffern in das Array aufnehmen. In diesem Fall müssen Sie wieder beachten, dass es hierbei keine Groß- und Kleinschreibung gibt, sodass es notwendig ist, die Vorgehensweise entsprechend anzupassen. Alternativ dazu können Sie ein eigenes Array für Ziffern erstellen, und dieses später in einer separaten Schleife durchgehen und entsprechend verschlüsseln.

Auswahl der Aufgabe und Eingabe des Codes

Nach dieser Vorarbeit fragen wir den Anwender, ob er den Text verschlüsseln oder entschlüsseln will. Außerdem fordern wir ihn dazu auf, den gewünschten Code – also den Wert für die Verschiebung der Positionen – einzugeben. Da die Eingabe von Werten über die Konsole bereits bekannt sein sollte, sind hierfür keine ausführlichen Erklärungen notwendig. Der entsprechende Code sieht dann so aus:

Nun müssen wir nur noch die entsprechenden Methoden aufrufen. Wenn der Anwender den Wert 1 eingegeben hat, rufen wir die Methode verschluesseln() auf. Bei der Eingabe des Werts 2 führen wir hingegen die Methode entschluesseln() aus. Beide erhalten als Übergabewerte den eingegebenen Code sowie die beiden Arrays mit den Groß- und Kleinbuchstaben. Außerdem fügen wir noch eine Nachricht ein, falls der Anwender einen ungültigen Wert eingegeben hat:

Damit ist das Hauptprogramm bereits abgeschlossen. Allerdings können wir es noch nicht ausprobieren, da wir die Methoden verschluesseln() und entschluesseln() noch nicht definiert haben. Wenn Sie das Programm aber dennoch bereits einmal ausführen möchten, können Sie den Aufruf der Methoden zunächst in einen Kommentar stellen. In diesem Fall sollte es sich problemlos ausführen lassen. Bislang fragt es aber lediglich ab, welche Aufgabe der Anwender erledigen will und welcher Code dafür zum Einsatz kommen soll. Die Implementierung der Ver- und Entschlüsselung ist dann die Aufgabe für den nächsten Abschnitt.

Methoden zum Ver- und Entschlüsseln

Für unser Programm bietet es sich an, die einzelnen Bestandteile in Methoden auszulagern. Allerdings arbeiten wir hierbei nicht mit Objekten. Um die Methode auch ohne ein Objekt aufrufen zu können, müssen wir sie mit dem Begriff static auszeichnen. Auf diese Weise können wir sie auf die gleiche Weise nutzen wie Funktionen in anderen Programmiersprachen. Die Methode verschluesseln() hat keinen Rückgabewert. Als Übergabewerte erhält sie wie bereits dargestellt den verwendeten Code und die Arrays mit den Groß- und Kleinbuchstaben. Diese müssen wir daher aufnehmen. Die Methodendefinition sieht dann wie folgt aus:

public static void verschluesseln(int code, char[] klein, char[]gross)

In der Methode verschluesseln() müssen wir zunächst den Namen der Datei abfragen, in der der ursprüngliche Text gespeichert ist. Danach müssen wir noch ermitteln, in welcher Datei der verschlüsselte Text abgespeichert werden soll. Diese beiden Aufgaben sind beinahe identisch – lediglich abgesehen vom Text, der den Anwender zur entsprechenden Eingabe auffordert. Daher bietet es sich an, hierfür eine Methode zu erstellen, die diese Aufgabe übernimmt und die den entsprechenden Text als Übergabewert annimmt. Diese können wir dann in beiden Fällen aufrufen. Das bietet auch den Vorteil, dass wir diese dann auch später beim Entschlüsseln nochmals verwenden können. Als Rückgabewert erhalten wir den Namen der Datei, den wir in einer passenden String-Variable aufnehmen müssen. Die Implementierung dieser Methode erfolgt erst später. Bisher rufen wir sie lediglich auf:

Nun müssen wir die Daten aus der Datei einlesen. Auch hierbei bietet sich wieder die Verwendung einer Methode an – zum einen um unser Programm klar zu strukturieren und zum anderen, da wir diese Aufgabe später beim Entschlüsseln wiederholen müssen. Diese Methode soll uns den Inhalt der Datei als String-Variable zurückgeben. Als Übergabewert benötigt sie den Dateinamen. Auch diese Methode definieren wir erst später, bislang rufen wir sie lediglich auf:

String inhalt = dateiEinlesen(datei1);

Nun können wir auf den ursprünglichen Text zugreifen und ihn verschlüsseln. Allerdings liegt er in einer String-Variable vor. Um ihn Buchstabe für Buchstabe durchzugehen, benötigen wir jedoch ein Array aus einzelnen Symbolen. Für diese Umwandlung bietet uns Java die Methode toCharArray() an. Diese wenden wir auf unsere Zeichenkette an und nehmen das Ergebnis in einem entsprechenden Array auf. Außerdem erstellen wir eine leere Zeichenkette, in der wir anschließend den verschlüsselten Text für die Ausgabe aufnehmen:

char[] charArray = inhalt.toCharArray();
String ausgabe = "";

Dieses Array gehen wir nun von Anfang bis Ende in einer for-Schleife durch. Diese leiten wir daher wie folgt ein:

for(int i = 0; i < charArray.length; i++)

Für jeden Buchstaben müssen wir nun überprüfen, ob eine Übereinstimmung entweder mit unserem Array für Kleinbuchstaben oder mit unserem Array für Großbuchstaben auftritt. Daher müssen wir diese nun ebenfalls von Anfang bis Ende durchgehen. Da sie jedoch die gleiche Länge haben, können wir dies in einer einzigen Schleife erledigen:

for (int j = 0; j < klein.length; j++)

In dieser Schleife findet nun der entscheidende Schritt für die Verschlüsselung statt. Dazu überprüfen wir, ob der aktuelle Buchstabe aus unserem Ausgangstext, den wir über die äußere Schleife definieren und auf den wir daher über den Zähler i zugreifen, mit einem Wert aus unserem Buchstaben-Array übereinstimmt. Dieses gehen wir in der inneren Schleife durch, sodass wir hierfür den Zähler j verwenden. Dabei überprüfen wir die Übereinstimmung in beiden Arrays. Das führt zu folgender Struktur:

if (charArray[i] == klein[j]){ 
}
else if (charArray[i] == gross[j]){ 
}

Wenn wir hierbei eine Übereinstimmung gefunden haben, müssen wir den entsprechenden Buchstaben verschlüsseln. Das bedeutet, dass wir an dieser Stelle in unserem Array mit dem Ausgangstext einen neuen Wert einfügen. Entsprechend unserer Verschlüsselungsmethode müssen wir dessen Position um den Wert unseres Codes erhöhen. Der ursprüngliche Buchstabe befindet sich an der Position j. Daher müssen wir an dieser Stelle im verschlüsselten Text den Buchstabe an der Position j + code einfügen. In den meisten Fällen führt das bereits zum richtigen Ergebnis. Allerdings treten Probleme auf, wenn das Ergebnis dieser Summe so groß ist, dass es die Grenze unseres Arrays überschreitet. In diesem Fall müssen wir wieder von vorne beginnen. Dieses Verhalten erreichen wir mit dem Modulo-Operator, der durch das Prozentzeichen symbolisiert wird. Dieser gibt den Rest der ganzzahligen Division an. Wenn wir den Wert der Summe durch die Größe des Arrays dividieren, erhalten wir als Rest immer genau die gewünschte Position – unabhängig davon, ob die Summer größer oder kleiner als das Array mit unseren Buchstaben ist. Den Wert an der entsprechenden Position fügen wir dann in unser charArray ein. Danach müssen wir die innere Schleife mit dem break-Befehl abbrechen – da wir sonst beim neuen Wert nach einigen weiteren Durchläufen wieder auf eine Übereinstimmung treffen würden. Die Vorgehensweise ist bei den Arrays für die Groß- und Kleinbuchstaben vollkommen identisch. Daher sehen die beiden if-Abfragen wie folgt aus:

Wenn wir bei einem Durchgang der inneren Schleife eine Übereinstimmung mit einem der beiden Arrays entdeckt haben, brechen wir diese ab, sodass wir mit der äußeren Schleife fortfahren und den nächsten Buchstaben überprüfen. Finden wir hingegen keine Übereinstimmung, führen wir keine Aktion durch. Die Schleife wird dann immer weiter durchlaufen. Wenn wir deren Ende erreicht haben, bedeutet das, dass unser Zeichen nicht in unseren Arrays enthalten ist. Dabei kann es sich beispielsweise um Satzzeichen oder um Leerzeichen handeln. Da wir beim Durchlauf der Schleife keinerlei Aktion durchgeführt haben, bleiben diese unverändert erhalten.

Nun geben wir noch den Inhalt der verschlüsselten Zeichenkette zur Überprüfung auf dem Bildschirm aus. Außerdem schreiben wir ihn in die Zieldatei. Dafür verwenden wir die Methode dateiSchreiben(), die wir anschließend erstellen werden. Damit ist die Methode verschluesseln() bereits beendet. Für einen besseren Überblick wird nun noch ihr vollständiger Code ausgegeben:

Im nächsten Schritt müssen wir die Methode entschluesseln() erstellen. Diese ist jedoch beinahe gleich aufgebaut wie die Methode verschluesseln(). Unterschiede bestehen lediglich bei den Texten für die Aufforderung zur Eingabe des Dateinamens und bei der Verschlüsselungstechnik. Statt die Position um den im Code vorgegebenen Wert zu erhöhen, müssen wir ihn erniedrigen. Daher ersetzen wir das Pluszeichen durch ein Minuszeichen. Die Methode sieht dann wie folgt aus:

Hilfsmethoden zur Abfrage der Dateinamen und zum Einlesen- und Ausgeben der Daten

Nun müssen wir noch die verschiedenen Methoden erstellen, mit denen wir den Dateinamen abfragen, die Daten einlesen und sie in eine Datei schreiben. Die erste dieser Methoden ist sehr einfach aufgebaut. Sie muss lediglich den vorgegebenen Text ausgeben und daraufhin den Dateinamen abfragen und diesen per return-Befehl zurückgeben. Hierfür sind keine weiteren Erklärungen notwendig:

Wenn Sie nun versuchen, das Programm auszuführen (hierzu müssen Sie die Aufrufe der noch nicht implementierten Methoden zum Einlesen und Schreiben der Daten als Kommentar auszeichnen), kommt es jedoch zu einem Fehler. Wie Sie sicherlich bereits wissen, müssen Sie in Java in allen Bereichen, die Eingaben vom Anwender abfragen, eine Ausnahme einfügen. Dazu haben wir zu Beginn dieser Methode den Begriff throws IOException verwendet. In den Methoden verschluesseln() und entschluesseln() fragen wir zwar keine Werte vom Anwender ab. Da wir jedoch die Methode dateiAbfragen() aufrufen, in der eine Ausnahme auftreten kann, müssen wir auch dort den entsprechenden Zusatz nachträglich hinzufügen.

Auch die Funktion zum Einlesen des Texts ist recht einfach aufgebaut. Wenn Sie bereits mit der Arbeit mit Dateien vertraut sind, sollte die Implementierung kein Problem darstellen. Wie immer beim Öffnen einer Datei müssen Sie zunächst einen FileInputStream, einen InputStreamReader und einen BufferedReader erstellen. Danach können Sie den Inhalt in einer while-Schleife mit der readLine()-Methode Zeile für Zeile einlesen und den Inhalt daraufhin per return-Befehl zurückgeben.

Wie immer bei der Arbeit mit Dateien muss dieser Bereich in einem try-Block stehen. Sollte es hierbei zu einem Fehler kommen, geben wir eine entsprechende Nachricht aus und verwenden den Begriff „Fehler“ als Rückgabewert. Nun wäre es noch sinnvoll, die Ausführung der Methoden verschlüsseln() und entschlüsseln() vorzeitig zu beenden, wenn es hierbei zu einem Fehler kommt. Dazu müssen Sie dort lediglich eine if-Abfrage erstellen, die überprüft, ob der Rückgabewert dem Begriff „Fehler“ entspricht und in diesem Fall den return-Befehl ausführen. Diese Aufgabe können Sie selbstständig erledigen. Sollten Sie dabei Schwierigkeiten haben, können Sie am Ende dieses Artikels im kompletten Programmcode nachschauen, wie Sie den entsprechenden Programmteil umsetzen können.

Nun müssen Sie nur noch die Methode zum Schreiben des bearbeiteten Texts erstellen. Auch dies sollte kein Problem darstellen, wenn Sie den grundlegenden Umgang mit Dateien in Java beherrschen. Achten Sie lediglich darauf, zunächst die createNewFile()-Methode anzuwenden. Diese führt dazu, dass das Programm eine neue Datei für die Aufnahme der Daten erstellt, falls noch keine Datei mit dem entsprechenden Namen vorhanden ist. Die Methode sieht dann wie folgt aus:

Java Kompendium 19.99 € Verfügbar In den Warenkorb

Der fertige Programmcode

Mit den genannten Schritten haben wir das Programm für das Verschlüsseln und Entschlüsseln der Texte bereits abgeschlossen. Da wir den Programmcode bisher aber nur in einzelnen Teilen vorgestellt und außerdem einige nachträgliche Änderungen daran vorgenommen haben, wollen wir den fertigen Code zum Abschluss nochmals komplett angeben:

Nun können Sie das Programm auch ausführen. Dazu ist es jedoch notwendig, zunächst den Ursprungstext in einer Datei abzuspeichern. Hierfür speichern wir den Ausdruck „Hier steht ein Text.“ in der Datei text.txt ab. Der übersetzte Text wird nun auf dem Bildschirm ausgegeben – so wie dies im folgenden Screenshot zu sehen ist. Außerdem sollte er in der Datei, die Sie als Ziel angegeben haben, erscheinen.

Weitere Möglichkeiten

Mit diesem Projekt haben wir bereits ein einfaches Verschlüsselungsprogramm erstellt. Wenn Sie Gefallen an dieser Aufgabe gefunden haben, können Sie dieses aber noch etwas erweitern. Selbstverständlich könnten Sie eine ganz andere Verschlüsselungsmethode verwenden, die den aktuellen Sicherheitsstandards entspricht. Das stellt jedoch eine äußerst anspruchsvolle Aufgabe dar. Einfacher ist es, die dargestellte Caesar-Verschlüsselung zu optimieren. Beispielsweise können Sie zwei Codes vom Anwender abfragen und für die Verschlüsselung bei den einzelnen Buchstaben abwechselnd den ersten und den zweiten Code verwenden. Das erhöht die Sicherheit bereits erheblich. Dieses System lässt sich auch noch weiter fortführen, um mit noch mehr Codes zu arbeiten und dadurch die Sicherheit weiter zu erhöhen. Daher bietet dieses Projekt noch viele Erweiterungsmöglichkeiten, bei deren Umsetzung Sie Ihre Programmierkenntnisse weiter verbessern können.

Ähnliche Produkte

Schreibe einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.