Homepagebau
Dateiversion:
diesen Beitrag diskutieren,
ergänzen, eine Frage stellen
Menü einblenden
 

Kryptographie

Schwierigkeitsgrad:

 

Beispiel 1: Caesar 1 - Verschlüsselung

Beispiel 2: Vigenere - Verschlüsselung


Kryptographie - eine Einführung

Des Webmaster's Lieblingsskripte - dazu zählen auch diese, welche den Zugriff auf bestimmte Daten im Web beschränken.

Diese Einführung wird einen einfachen Algorithmus vorstellen, der es ihnen dennoch erlaubt, Nutzerdaten in JavaScript relativ sicher zu verschlüsseln und so vor fremden Augen zu verbergen.

Von guten Skripten und bösen Buben

JavaScript ist - das muss man betonen - nicht geeignet um wirklich sensible Daten zu sichern. Das liegt daran, dass JavaScript clientseitig ausgeführt wird, was zur Folge hat, dass die Passwortdatei, welche die Daten enthält in jedem Fall auf den Rechner des Nutzers übertragen wird. Außerdem ist JavaScript völlig unzureichend um den Zugriff z.Bsp. auf eine bestimmte Webseite zu beschränken, da sich JavaScript im Browser sehr einfach ausschalten lässt und die Zielseite so dennoch sichtbar wird.

Aber: der Algorithmus ist universell und kann auch in anderen Programmiersprachen implementiert werden. JavaScript soll hier quasi als Beispiel dienen... und in Anbetracht dessen, dass private Webprojekte ohnehin kaum wirklich sensible Daten zu schützen haben, ist selbst dieser vergleichsweise primitive Schutz meist ohnehin bereits mehr als ausreichend.

Wie man anfängt...

Einfach gesagt, besteht jedes Tool, welches etwas ver- oder entschlüsselt aus 3 Arbeitsschritten:

Im Grunde genommen - wenn es z.Bsp. nur um just4fun geht - wäre es also bereits mit folgender Zeile Code getan:

if (window.prompt("Wie lautet das Passwort?") == "passwort")
{ document.location = "geschützteSeite.html" };

Den Quelltext muss man wohl nicht näher erläutern...
Im Folgenden werde ich mich darauf beschränken, dass Verschlüsseln von Daten zu beschreiben und die Nutzereingabe vorher, oder den Aufruf einer Zielseite bzw. Ausgabe der Zieldaten nachher nicht weiter erläutern, da diese Schritte ohnehin klar sein sollten.

Kommen wir also schnell zu den wirklich interessanten Dingen des Lebens: den Verschlüsselungsalgorithmen.

Ich habe nun die undankbare Aufgabe, ihnen sowohl das nötigste theoretische Wissen zu Vermitteln, um unter den Kollegen nicht als kompletter Idiot dazustehen, mich dazu aber auf in der Praxis wirklich anwendbare Beispiele zu beschränken um sie nicht zu langweilen und gleichzeitig zu allem Überfluss mich dabei auch noch möglichst kurz zu fassen.

Zunächst möchte ich mich mit ihnen auf einige Begriffe einigen.
Es gibt eine Reihe von Möglichkeiten, Nachrichten zu verschlüsseln. Die "Kunst" oder "Wissenschaft" der Verschlüsselung wird als "Kryptographie" bezeichnet. Entgegengesetzt bezeichnet man den Versuch der Entschlüsselung eines verschlüsselten Textes ohne Kenntnis des Schlüssels (also das "Knacken" eines Codes) als "Kryptoanalyse". Den unverschlüsselten Text nennt man auch "Klartext", während man eine Folge verschlüsselter Buchstaben auch als "chiffrierten Text" oder kurz "Chiffre" bezeichnet. Eine Menge von Buchstaben bezeichnet man auch gern als "Alphabet". Die Menge der Buchstaben des Klartextes wird dem entsprechend als "Klartextalphabet" bezeichnet. Korrespondierend nennt man das "Alphabet" des verschlüsselten Textes "Chiffrealphabet". Diese können - müssen aber nicht unbedingt - verschieden sein. Ein "Verschlüsselungsalgorithmus" ist nun eine Vorschrift die besagt, wie ein Text kodiert bzw. dekodiert werden muss. Sie ordnet abhängig vom gewählten "Schlüssel" jedem Buchstaben des Klartextalphabets einen Buchstaben des Chiffrealphabets zu. Ein Schlüssel (oder "Passwort") ist ein Text, welcher eine variable Komponente des Verschlüsselungsalgorithmus darstellt.

All dies zusammen genommen: Klartextalphabet, das erzeugbare Chiffrealphabet, die dazu verwendeten Verschlüsselungsalgorithmen (möglicherweise sind dies ja mehrere) und die möglichen Schlüssel werden als "Verschlüsselungsverfahren" oder "Kryptosystem" bezeichnet.

Geschichtlicher Exkurs:
Verschlüsselungsverfahren sind fast so alt wie die Menschheit. Sie haben Aufbau und Niedergang von Imperien gesehen, für Tod oder Überleben gekrönter Häupter gesorgt, politische Intrigen gedeckt und geheime Liebe vor gar zu neugierigen Augen verborgen.
Es ist bekannt, dass Julius Caesar sich schon während der gallischen Kriege eines Verschlüsselungsverfahrens bediente, dass heute seinen Namen trägt und gerade bei Kids auch heute noch Anwendung findet. Bei der "Caesar" –Verschiebung werden alle Buchstaben des Alphabets durch den Buchstaben ersetzt, der im Alphabet eine feste Anzahl von Stellen später folgt. Die genaue Zahl von Stellen, die sich die Buchstaben des Alphabets verschieben wird durch den Schlüssel beschrieben. Werden Klartext- und Chiffrealphabet untereinander geschrieben (wie im Beispiel unten), wird deutlich, dass beide um einige Stellen gegeneinander verschoben sind.

Aus der Geschichte wissen wir außerdem, dass Caesar als Schlüssel die Zahl 3 und damit eine Verschiebung um 3 Stellen bevorzugte.

Beispiel:

a b c d e f g h i j k l m n o p q r s t u v w x y z
C D E F G H I J K L M N O P Q R S T U V W X Y Z A B

Klartext: "alea iacta est" (lat. Die Würfel sind gefallen)
Schlüssel: 3
Chiffre: CNGC KCEVC GUV

Man hat sich in der Kryptographie darauf geeinigt, das Klartextalphabet mit kleinen, das Chiffrealphabet dagegen großen Buchstaben zu schreiben. Daran werde ich mich ebenfalls halten. Was man hier außerdem sieht ist, dass es gerade einmal 25 verschiedene Schlüssel gibt. Jemand, der eine so verschlüsselte Nachricht abfängt und ahnt, dass es sich um eine Cäsarverschiebung handelt, wird keine Mühe haben den Text durch Ausprobieren zu entschlüsseln.

Okay - los geht's. Schreiben wir also unseren ersten Verschlüsselungsalgorithmus. Zuerst muss man wissen, dass jedem Zeichen eine ganze Zahl, eine so genannte Unicode-Nummer entspricht (das ist die Positionsnummer des Zeichens in der Zeichentabelle). Was wir nun tun, ist alle Zeichen der Eingabe in ihre Unicode-Werte umzurechnen und dann einfach 1 zu addieren (Rechts-Shift). Schon haben wir eine einfache Verschlüsselung.

Beispiel 1:

klassischer "Rechts-Shift" - Verschlüsselungsalgorithmus

var originalText = "passwort";
var kodierterText = "";

Wir gehen den Text Zeichen für Zeichen durch:
for (var i = 0; i < originalText.length; i++) {
  Zuerst wandeln wir das Zeichen in seinen Unicode-Wert um...
  var unicode = originalText.charCodeAt(i);
  ...addieren 1...
  unicode++;
  ...und wandeln es wieder in ein normales Zeichen um - dass wir einfach anhängen
  kodierterText += String.fromCharCode(unicode);
};

Voila -  der kodierte Text lautet nun: 

Ausprobieren:

zu kodierender Text:

Bessere Versionen

Bleiben wir bei diesem einfachen Prinzip und schauen, wie man es verbessern kann.
Zunächst könnte man den Unicode-Wert auch um eine beliebige andere Zahl als "1" erhöhen. Das allein bringt aber nicht wirklich einen Zugewinn an Sicherheit, da es sich weiterhin um einen konstanten Wert handelt. Alle Werte werden um einen konstanten Wert erhöht: die Chance durchschaut zu werden ist dementsprechend hoch. Um unser Verfahren wirklich zu verbessern, müssten wir diesen Wert irgendwie auch während der Verschlüsselung variabel gestalten. Wenn sich die Zahl, die wir addieren, während des Prozesses ändern würde, hätten wir viel für die Sicherheit getan.

Geschichtlicher Exkurs:
Ich denke, ich muss nicht näher erläutern, wo der Schwachpunkt dieser Verschlüsselungsmethode liegt.
In der Zeit nach Caesar geriet in Europa unter dem Einfluss der katholischen Kirche die Kunst der Verschlüsselung in Vergessenheit und so war es hauptsächlich das alte Arabien, dass in der Zeit seiner Blüte immer neue und raffiniertere Techniken der Verschlüsselung für seinen gewaltigen aber auf Verschwiegenheit bedachten Staatsapparat entwickelte. Dabei wurde nun das Alphabet nicht mehr einfach verschoben: jeder Buchstabe des Alphabets war beliebig mit irgendeinem anderen vertauschbar. Dieses heute unter der Bezeichnung "monoalphabetische Substition" bekannte Verfahren erhöhte die Zahl möglicher Schlüssel von 25 auf 26 Fakultät (ca. 4*1026) und lange Zeit galt diese Verschlüsselung daher als unknackbar.

Doch es gibt ein Schlupfloch: da alle Buchstaben mit dem selben Schlüssel verschlüsselt wurden, bedeuten gleiche Buchstaben im Chiffre auch stets gleiche Buchstaben im Klartext. Dies war genau der Ansatz, den die arabischen Kryptoanalytiker zum Brechen der Verschlüsselung benötigten. In jeder Sprache gibt es (wie sie wissen) Buchstaben die innerhalb eines geschriebenen Textes häufiger Auftreten als andere. Mehr noch: es gibt sogar eine ganz spezifische Verteilung der Häufigkeiten für jeden einzelnen Buchstaben die in jedem ausreichend langen Text der gleichen Sprache annähernd identisch ist. Die Überlegung war nun: angenommen man kennt die Sprache, in der eine verschlüsselte Botschaft verfasst ist und zählt die Häufigkeit der Buchstaben der Geheimnachricht  aus, so müssen die Häufigkeiten der verschlüsselten Buchstaben zumindest ungefähr zu den Häufigkeiten der Klartextbuchstaben passen. Dieser Angriff auf eine Verschlüsselung ist heute als "Häufigkeitsanalyse" bekannt und gehört zum Handwerkszeug eines jeden Kryptoanalytikers. Dennoch sollte es noch bis Ende des 15. Jhd. hinein dauern, bis man sich auch in Europa dieses Ansatzes bewusst wurde.

Es war schließlich der Franzose Blaise de Vignère, der Mitte des 16. Jhd. ein Verschlüsselungsverfahren (die erste "polyalphabetische Substitution") entwickelte, das bis zu Beginn des 19. Jhd. nicht gebrochen werden konnte. Bei der nach ihm benannten "Vigenere" –Verschlüsselung wird während der Verschlüsselung immer wieder zwischen verschiedenen Schlüsseln gewechselt. Das bedeutet: das Passwort besteht aus einer Reihe von Buchstaben. Jeder Buchstabe steht dabei für eine Zahl zwischen 0 und 25 (A=0, B=1, ..., Z=25). Nun wendet man eine einfache Caesarverschiebung an und verschiebt den ersten Buchstaben des Klartextes um genau den Zahlenwert, den der erste Buchstabe des Schlüssels hat. Der zweite Buchstabe des Klartextes wird um den Zahlenwert des zweiten Buchstaben des Schlüssels verschoben ... und so weiter, bis das Ende des Schlüssels erreicht ist. Dann beginnt man erneut mit dessen erstem Buchstaben.

Beispiel:

Klartext: "ich bin der geist der stets verneint" (ein Abschnitt aus Goethes Faust)
Schlüssel: GOETHE = 6,14,4,19,7,4
Chiffre:
i + 6 Stellen = O
c + 14 Stellen = Q
h + 4 Stellen = L
b + 19 Stellen = U
i + 7 Stellen = P
n + 4 Stellen = R
d + 6 Stellen = J
... ergibt folgende Chiffre:
OQLUPRJSVZLMYHHXYWZTXLCIXBIBUX

Anmerkung: der nun beschriebene Algorithmus wendet dieses Prinzip auf alle verfügbaren Zeichen, also nicht nur auf die Buchstaben a-z an und kommt daher auch zu einem anderen Ergebnis als unser Beispiel. Er arbeitet jedoch nach dem gleichen Muster.

Tipp:
Als 2. Passwort können sie zum Beispiel den Login oder Nickname ihrer Besucher verwenden.

Wir wollen es noch etwas sicherer machen und nehmen ein 2. Passwort. Auch dieses Passwort wandeln wir in Unicode-Werte um, und erhalten wieder eine Kette von Zahlen. Jetzt kommt der interessante Teil: Wir addieren die Unicode-Werte des 1. Zeichens des ersten Passwortes und des 1. Zeichens des zweiten Passwortes. Danach des 2. Zeichens des ersten und des 2. Zeichens des zweiten Passwortes usw. - bis wir am Ende angekommen sind. Falls das 2. Passwort kürzer sein sollte, fangen wir einfach von vorn an.

Beispiel 2:

verbesserter Verschlüsselungsalgorithmus

var originalText = "passwort";
var zweitesPasswort = "text";
var kodierterText = "";

Wir gehen beide Texte wieder Zeichen für Zeichen durch:
for (var i = 0; i < originalText.length; i++) {
  var unicode1 = originalText.charCodeAt(i);
  Anmerkung:
  "%" ist der "modulo"-Operator: er liefert den Rest der Division des ersten durch
  den zweiten Operator; auf diese Weise erhalten wir die aktuelle Position auch dann,
  wenn das 2. Passwort kürzer als der Originaltext ist
  var unicode2 = zweitesPasswort.charCodeAt(i % zweitesPasswort.length);
  wir addieren beide Unicode-Werte miteinander um das kodierte Zeichen zu erhalten...
  var summe = unicode1 + unicode2;
  ...und hängen es (wie oben) einfach an.
  kodierterText += String.fromCharCode(summe);
};

kodierter Text: 

Ausprobieren:

zu kodierender Text:
Passwort:

Um noch mehr Sicherheit zu erlangen: könnte man Benutzername und Passwort als Eingabe nehmen und auf diese Weise kodieren.
Das Ergebnis dieser Kodierung kann nun als Passwort verwendet werden, um die eigentlichen Daten, die geschützt werden sollen auf die gleiche Weise zu kodieren. Damit erhält man Daten, die verschlüsselt sind und deren Schlüssel wiederum selbst verschlüsselt ist.
Im Fall der Dekodierung heißt das, die Daten liegen kodiert vor. Mit der Eingabe von Benutzername und Passwort wird ein kodierter Schlüssel erstellt und dieser kodierte Schlüssel ermöglicht das dekodieren der geschützten Daten.

Diese Verschlüsselung ist normalerweise mehr als ausreichend, um die meisten Gelegenheitshacker davon abzuhalten, ihre Daten zu mopsen. Wenn ihr Passwort halbwegs gescheit gewählt ist - also mindestens 10 Zeichen lang und nicht unbedingt in jedem Duden steht - haben sie es einem potentiellen Angreifer bereits sehr schwer gemacht...

Geschichtlicher Exkurs:
Es war Mitte des 19. Jhd. als ein intelligenter, engagierter Tüftler: ein Brite namens Charles Babbage die Vigenere-Verschlüsselung erstmalig knacken konnte. Für diese Einführung soll es jedoch zunächst genügen, DASS es jemandem gelungen ist.

Damit auch genug für heute: ich hoffe es hat ihnen gefallen... Schauen sie bei Gelegenheit wieder vorbei. Dies wird sicher nicht der letzte Beitrag zu diesem Thema bleiben.