Bash IT-Security: Verschlüsselung

Das Verständnis zur Grundidee und zum Ablauf der Kurse in unserem Classic-Format ist notwendige Voraussetzung zur Durchführung eines Kurses. Unsicher?

Bash IT-Security: Verschlüsselung

Kennenlernen

Vorstellungsrunde mit Programmiererfahrung/Motivation

Ihr stellt euch vor und erzählt, wie ihr zur Hacker School und zum Coden gekommen seid.
Nun die Teilnehmer:

  • Wie heißt Du? (Achtet darauf, dass die Kinder sich nur mit Vornamen vorstellen – Datenschutz.)
  • Warum bist Du hier?
  • Hast Du schon mal programmiert?
  • Was willst Du lernen?
Vorstellung interaktiver gestalten? (!Klick mich an!)

In unserem Inspirer Handbuch findet ihr
weitere Spielideen.
Wenn Du die Vorstellung etwas interaktiver gestalten möchtest, empfehlen wir das Spiel “Alle, die”, was im folgenden erklärt wird:

Spielidee und Ziel

  • Wir kommen locker und leicht mit den Teilnehmer*innen ins Gespräch und erfahren, was sie gerne mögen (positiver Beziehungsaufbau).
  • Wir können eine erste Diagnose stellen, was die Schülerinnen und Schüler können, was sie gerne mögen.

Ablauf

  1. Stellt Euch vor die Klasse.
  2. Ein*e Inspirer sagt: “Alle, die”-Frage z.B: “Alle, die Sport in der Freizeit machen?”.
  3. Alle, die sich angesprochen fühlen, stehen von ihrem Platz auf.
  4. Die*der Inspirer stellt Rückfragen und kommt ins Gespräch mit den Teilnehmer*innen, z.B. “Cool, du in der ersten Reihe: Wie heißt du? [Antwort] Welchen Sport machst du denn gerne? [Gespräch entsteht] Super und du in der letzten Reihe…”.
  5. Die*der Inspirer sagt: "Alle wieder setzen".
  6. Die*der Inspirer stellt die nächste Frage: z.B. “Alle, die gerne Spiele auf dem Handy oder Computer spielen!”
  7. Siehe 3.-5.
  8. Spielt das Ganze etwa 5 min (nach Gefühl)
Sammlung möglicher Fragen (!Klick mich an!)

Diese Sammlung kann gern erweitert oder angepasst werden.

IT/Programmieren

  • Wer hat schon mal programmiert?
  • Wer kann sich vorstellen etwas mit Programmieren und IT zu machen?

Hobbies

  • Wer von Euch macht Sport in der Freizeit?
  • Wer spielt ein Instrument?
  • Wer spielt Computerspiele?
  • Wer spielt Handyspiele?

Lustiges

  • Wer hat eine Schuhgröße größer als 35?

Letzte Frage

  • Wer ist schon in repl.it angemeldet?

Programmieren

Zeit: ~ 3h + 30 min Pause
Ort: Kleingruppe
Verantwortlich: Inspirer

Gebt den Teilnehmenden eine kleine Motivation dafür, was ab jetzt passieren wird. Sie werden nachher wissen, was eine Shell ist, und wie sie man sie (grob) bedienen kann. Genauer werden sie:

  • Das Dateisystem eines Computers kennenlernen.
  • Die wichtigsten Shell-Commands kennenlernen.
  • Etwas über sehr grundlegende Verschlüsselungen erfahren.
  • Ihre eigenen kleinen Shell-Skripte schreiben.

Hallo, Shell!

Beantwortet und erläutert die absoluten Basics:

  • Wie ist ein Dateisystem auf einem Computer organisiert?
  • Wie 'bewege' ich mich darin?
  • Wie gebe ich Dinge auf der Kommandozeile aus?

Lernziele

Die Antworten auf oben genannte Fragen :)
(Geht also mindestens auf die unten genannten Commands ein.)

Code

λ ls
λ ls -l
λ cd
λ pwd
λ echo "Hallo, Shell!"

Veränderung des Dateisystems

Wie erstelle ich einen Ordner, eine Datei auf der Command Line?
Wie kopiere, verschiebe und lösche ich sie?

Lernziel(e)

  • All das oben genannte können – also von mkdir, touch, cp, mv und rm die Basics beherrschen.

Code

λ mkdir <foldername>
λ touch <file1> <file2> <file3> <file4> ...
λ cp <file/folder> <file/folder>
λ cp <file/folder> <file/folder>
λ mv <file/folder> <file/folder>
λ rm <file>
λ rm -rf <folder>

Aufgabe

Um das oben gelernte zu testen, sollen die Teilnehmenden folgende Aufgaben ausführen:

  1. einen neuen Ordner in ihrer Repl erstellen
  2. im Ordner eine neue Datei erstellen
  3. diese gerade erstellte Datei zweifach kopieren
  4. eine der beiden Versionen aus dem Ordner heraus bewegen (also eine Ebene nach oben)
  5. Die gerade aus dem Ordner heraus bewegte Datei löschen
  6. eine der beiden Dateien im Ordner umbenennen
  7. und, zu guter Letzt, den gesamten Ordner mit Inhalt löschen.

Am Ende dessen sollte der Ausgangszustand wiederhergestellt sein – stellt sicher, dass das der Fall ist :)

Unser erstes Skript

Wie kann man automatisiert Dinge aus der Kommandozeile ausführen?
-> Mit Skripten. Und darum kümmern wir uns jetzt.
Erstellt unten stehendes Skript als (neue Datei) hello.sh.
Versucht, es mit ./hello.sh auszuführen.
Geht, da das nicht funktionieren wird, auf chmod und dessen Bedeutung ein – dafür braucht ihr auch wieder ls -l.

Lernziel(e)

  • Erstellen von bash-Skripten (z.B. wieso #!/usr/bin/bash)?
  • Ausführen von Dateien: ./<filename>
  • Berechtigungen und ls -l
  • chmod, Berechtigungen und seine Benutzung.

Code

hello.sh:

1
echo "Hello World"

λ touch hello.sh
λ ./hello.sh
bash: ./hello.sh: Permission denied
λ ls -l
λ chmod 744 hello.sh
λ ./hello.sh
Hello World

Dateien in der Command Line

Wir können Dateien auch in der Command Line selbst anzeigen und bearbeiten.
Das geht mit cat (anzeigen) und nano (bearbeiten).
Fürs Bearbeiten kommen natürlich auch vi, vim und emacs infrage, aber darauf gehen wir hier nicht weiter ein – es sei denn, es gibt Nachfragen in dieser Richtung.

λ cat hello.sh
echo "Hello World"
λ nano hello.sh
# ein nano-Fenster öffnet sich – dort kann man die Datei bearbeiten.

Zeit für eine Pause!

Verschlüsselungen: Anfänge

Soo, dann geht es jetzt ab zum zweiten Teil dieses Kurses: Verschlüsselungen.

Es war schon immer wichtig, Informationen irgendwie geheim übermitteln zu können. Eine der ersten dieser Methoden war die sogenannte Caesar-Verschlüsselung. Bei ihr wird der zu verschlüsselnde Text 'innerhalb des Alphabets verschoben'. Am leichtesten versteht man es an einem Beispiel:
Hallo -> Ibmmp (Bei einer Verschiebung um 1.)
Es wird also in der verschlüsselten Nachricht (bei einer Verschiebung um einen Buchstaben) statt einem A ein B, statt einem B ein C usw. abgebildet. Die Entschlüsselung ist damit auch relativ einfach möglich – man dreht den Prozess um, 'ver'schlüsselt also die erhaltene Nachricht mit einer Verschiebung um -1, und erhält den Text zurück.

Lernziel(e)

  • Die Funktionsweise der Caesar-Verschlüsselung.

Aufgabe

Um das oben gelernte zu testen, sollen die Teilnehmenden folgende Aufgaben ausführen:

  1. Verschlüsselung von Hallo mit v = 3
  2. Entschlüsselung des folgenden Satzes:
    Nhm ljqtgj kjnjwqnhm, ifxx nhm jns Yzsnhmylzy gns. (v = 5)

Und damit wir das nicht weiter von Hand machen müssen, wollen wir das jetzt in der Programmiersprache bash implementieren. Dafür brauchen wir noch ein bisschen bash-Wissen – und das kommt jetzt :)

bash: eine Programmiersprache

bash ist nicht nur eine Kommandozeile, sondern auch eine Programmiersprache. Das Skript, das wir bisher geschrieben haben, war schon ein Programm in der Sprache bash, allerdings haben wir dort noch keines der Konstrukte, die die Sprache hat, spezifisch genutzt. Das wollen wir jetzt ändern.
Erstellt eine neue Datei namens greet.sh.
Deklariert gemeinsam mit den Teilnehmenden eine Variable.
Gebt diese Variable mit echo ${VAR} aus.

Lernziel(e)

  • Variablen: Deklaration und Nutzung verstehen
  • for in-loop benutzen können
  • Slices verstehen und benutzen können
  • Die Pipe (|) benutzen können
  • tr benutzen können

Code

greet.sh:

1
2
3
4

#!/usr/bin/bash

name=Beat echo "Hallo, ich bin" $name

greet_all.sh:

1
2
3
4
5
6
7

#!/usr/bin/bash

names=(inspirer tn1 tn2 tn3 tn4 tn5 tn6)
for name in "${names[@]}"
do
echo "Hallo," $name
done

bash: Part 2

Das waren schon einmal die wichtigeren Programmierkonstrukte, die wir für die Implementierung der Caesar-Verschlüsselung brauchen werden – drei weitere Dinge kommen hier noch dazu. Slices, tr sowie pipes.

Slices

Erstellt eine neue Datei namens slice.sh.
Deklariert gemeinsam mit den Teilnehmenden eine Variable, die eine Zeichenkette enthält.
Gebt diese Variable mit echo ${VAR} (oder echo $VAR) aus, nur dass wir diesmal auswählen, welchen Teil der Zeichenkette wir 'herausschneiden' wollen.
Das funktioniert mit ${VAR:start:länge} – siehe unten im Beispiel.

tr

tr ist eines der Standard-Kommandozeilenprogramme. Es eignet sich sehr gut dafür, einzelne Buchstaben in einer Zeichenkette zu ersetzen.
tr a b ersetzt zum Beispiel alle Buchstaben 'a' (nur die kleinen) mit dem Buchstaben 'b'.

Pipes

Nun zu den pipes. Pipes sind etwas, das man auch in der Kommandozeile regelmäßig benutzt. Die Grundidee ist, dass man bestimmte Programme/Funktionalitäten hintereinander auf den gleichen Daten ausführen möchte. Die Kommandozeilenausgabe des vorderen Programms wird dabei zum Input des nächsten. Das sieht dann folgendermaßen aus:

λ echo aabb | tr a b
bbbb
λ echo Maus | tr a-z A-Z
MAUS

Lernziel(e)

  • Slices verstehen und benutzen können
  • Die Pipe (|) benutzen können
  • tr benutzen können

Code

slice.sh:

1
2
3
4

#!/usr/bin/bash

name=dasistmeinname echo ${name:0:3}

Aufgabe

Um das oben gelernte zu testen, sollen die Teilnehmenden folgende Aufgaben ausführen:

  1. Ändert das Skript slice.sh so ab, dass es alle Worte eurer Zeichenkette nacheinander ausgibt.
  2. Ersetzt in folgendem Satz alle Groß- mit Kleinbuchstaben:
    Ich gelobe feierlich, dass ich ein Tunichtgut bin.

Caesar: Verschlüsseln

So, dann geht es jetzt ans Zusammenführen. Schreibt ganz langsam untenstehendes Programm, und erklärt bei jedem winzigen Schritt warum ihr ihn gerade geht.

Eine neue Sache kommt hier noch mit dazu, und das sind die (implizite) Kommandozeilenargumente $1 und $2. Sie stellen das Argument an erster respektive zweiter Stelle im Aufruf dar.
Bei einem Aufruf mit:

λ ./enc_caesar.sh 1 Hallo
Ibmmp

würden in unserem Skript $1=1 und $2=Hallo gelten.

Lernziel(e)

Ein Verständnis dessen, was unser Programm macht.

  • Was machen dual und DUAL?
  • Was macht der erste tr-Aufruf?
  • Was der zweite?

Code

enc_caesar.sh:

1
2
3
4
5
6
7

#!/usr/bin/bash

dual=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz DUAL=ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ encrypted=$(echo $2 | tr "${dual:0:26}" "${dual:$1:26}" | tr "${DUAL:0:26}" "${DUAL:$1:26}")
echo ${encrypted}

Caesar: Entschlüsseln

Nachrichten zu verschlüsseln ist schön und gut, aber irgendwie wollen wir jetzt ja auch gegenseitig unsere geheimen Nachrichten lesen können – oder gar die der anderen abfangen und entschlüsseln?
Wenn wir wissen, was der Schüssel ist, können wir das jetzt sogar schon sehr einfach. Wir müssen die Nachricht nur 'noch einmal' verschlüsseln, nun aber mit dem 'gegenteiligen' Schlüssel. Wenn wir also Hallo mit 1 verschlüsselt haben, müssten wir es jetzt mit 25 (also 26 - v) verschlüsseln – und wir erhalten unseren alten Text zurück.

λ ./enc_caesar.sh 1 Hallo
Ibmmp
λ ./enc_caesar.sh 25 Ibmmp
Hallo

Da das aber ziemlich mühselig wird, wenn man die Verschiebung der Nachricht nicht kennt, bietet sich wieder einmal ein Programm als Lösung an. Einen solchen Ansatz, bei dem man einfach stumpf alle Möglichkeiten ausprobiert, nennt man brute force (rohe Gewalt).
Das geht in diesem Fall folgendermaßen:

Code

dec_caesar.sh:

1
2
3
4
5
6
7
8
9

#!/usr/bin/bash

dual=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz DUAL=ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ for i in {1..26}
do
decrypted=$(echo $1 | tr "${dual:0:26}" "${dual:$i:26}" | tr "${DUAL:0:26}" "${DUAL:$i:26}") echo ${decrypted}
done

Wir schreiben also einfach einen for in-loop, der uns die Arbeit des 'alle Zahlen von 1 bis 26 ausprobieren' abnimmt.