IT-Security: Verschlüsselung in Bash

Genereller Ablauf

  • Der Kurs beginnt mit der Begrüßung im Plenum. Ein erfahrener Inspirer übernimmt die Einführung in das Thema und versucht sicherzustellen, dass die Technik bei den Meisten funktioniert. Danach werden die Teilnehmenden in kleine Teams eingeteilt. Jeder Inspirer ist während dem Kurs für etwa 4 bis 6 Teilnehmende verantwortlich.
  • Die eingeteilten Teams werden in Breakout-Rooms (bei Zoom) eingeteilt. Wenn ihr in den Breakout Rooms Fragen habt, ruft gerne über Zoom um Hilfe. Der Haupt-Inspirer wird dann zu euch in den Breakout-Room kommen.
  • Vorstellungsrunde in den Gruppen. Stellt euch einmal vor und erklärt gerne, wie ihr zu der IT gekommen seid. Lasst die Teilnehmenden sich vorstellen, inklusive Programmiererfahrung, Erwartungen und Motivation.
  • Jetzt geht es ans Eingemachte: Programmieren! Mehr Informationen zu den Einheiten findet ihr unten.
  • Versucht nach etwa der Halbzeit eine Pause von 30 Minuten einzulegen.
  • Der Abschluss findet wieder im Plenum mit der gesamten Klasse statt. Hier stellt sich jeder Inspirer einmal kurz vor und erklärt, warum er*sie für IT brennt.

P.S.: Vergesst nicht, eure Pausen zu machen 🙂

Hinweise zum Konzept

Lernziele

  • Es geht darum, die Teilnehmenden zu begeistern. Unser Ziel ist es, dass sie nach den 3 Stunden Kurs Interesse haben, noch weiter zu recherchieren und zu programmieren. Wie das bei euch konkret aussieht, ist euch überlassen. Ihr merkt, die Teilnehmenden haben voll Lust mit euch eine halbe Stunde über Roboter zu reden? Macht das gerne.
  • Versucht eher, den Teilnehmenden grundlegende Konzepte beizubringen (“Wie debugge ich ein Programm?”), als Ihnen diese eine Eigenheit von Python lang und breit zu erklären. Zeigt/erklärt ihnen auch gerne, wo das, was sie gerade lernen, im echten Leben zum Einsatz kommt.
  • Lasst die Teilnehmenden so viele Schritte wie möglich selbst gehen. Sie werden so am meisten lernen, und sind hoffentlich auch in der Lage, an das Gelernte nach Ende des Kurses anknüpfen zu können.
  • Lasst sie dabei auch scheitern. Im Optimalfall versucht ihr dann mit ihnen gemeinsam zu ergründen, wieso ihr Ansatz nicht funktioniert hat – dadurch müssen sie ihre Gedanken kommunizieren und lernen so mehr.
  • Dieses Konzept ist unser Vorschlag, wie man Kinder und Jugendliche begeistern könnte. Seht es also mehr als groben Leitfaden und weniger als festen Lehrplan.

Feedback und Fragen an kurskonzepte@hacker-school.de.

Technologie

  • Wir arbeiten während dem Kurs mit dem Online-Editor Repl.it -> https://repl.it
  • Wie genau die Kids sich einloggen und mit welchen Accounts sie arbeiten, erklärt der Team-Inspirer am Anfang im Plenum. Das ist also nicht eure Aufgabe, darum kümmern wir uns.

Konzept

Begrüßung und generelle Motivation

  • Wer sind wir und was wünschen wir uns? (an die Kinder gerichtet)
    • Hacker School: Wir wollen, dass ihr alle etwas mitnehmen könnt. Uns ist es lieber, dass ihr Zusammenhänge verstanden habt, aber dafür insgesamt weniger Stoff. (Wird trotzdem vorkommen, dass euch Dinge überfordern, aber das ist normal. Behaltet das trotzdem im Hinterkopf)
    • Vordergründig bringen wir euch heute Programmieren bei, aber eigentlich geht es uns auch darum, euch mit Menschen zusammenzubringen, die das richtige Mindset haben. Damit ihr von Ihnen lernen könnt. Wenn ihr inhaltlich überhaupt nichts verstehen solltet, aber dafür die Fehlerkultur mitnehmt, sind wir happy.
    • A propos Fehlerkultur: Wenn ihr etwas nicht versteht – fragt nach. Das hier soll alles werden, bloß kein Frontalunterricht, in dem ihr Dinge schlucken, verdauen und nachher wieder auskotzen sollt. Uns geht es darum, dass ihr Spaß habt, und vor allem: etwas für euch lernt und mitnehmt. Und gerade dem stehen so ein paar Dinge im Weg, wie: Schon beim ersten kleinen Fitzelchen Syntax zu scheitern. Also: Wenn ihr jetzt gleich bei euren Inspirern seid und euer Programm nicht funktioniert, was macht ihr dann? Richtig. Fragt nach.
  • grober inhaltlicher Überblick
  • zeitlicher Überblick
  • Einmal kurz die Technologie durchgehen

Vorstellungsrunde

  • Stellt euch selber vor. (2-3 Sätze)
    • Was habt ihr gemacht, als ihr so alt wart wie die Teilnehmenden?
  • Lasst die Teilnehmenden sich vorstellen.
    • Wie heißt du?
    • Hast du schonmal programmiert?
    • Was erhoffst du dir von diesem Kurs?

Wichtig: achtet darauf, dass die Kinder sich nur mit Vornamen vorstellen – Datenschutz.

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.

Abschluss

~5 min
  • Wenn ihr eurer Gruppe am Ende noch Feedback geben wollt, dann nehmt euch gerne jetzt Zeit dafür.
  • Fragt nach, ob jemand (in der Abschlussrunde im großen Plenum) vorstellen möchte, was ihr so gemacht habt.
~20 min
  • Die Teilnehmenden stellen ihre Projekte vor (eine*r pro Gruppe), und erzählen ein bisschen, was sie so gemacht haben.
  • Die Inspirer reden über sich, wie sie zur IT gekommen sind, was ihnen daran Spaß macht, wieso sie es weiterhin machen wollen, und was sie den Jugendlichen gerne mitgeben möchten.
  • (Wenn erwünscht, bekommt der*die Lehrer*in kurz das Wort)
  • Feedbacklink geht raus