Caesar Chiffre/Verschlüsselung in C#

Schon im alten Rom gab es wurden Politik und Wirtschaft stark von der Korruption beeinflusst. Cäsar selbst ist ein Gutes beispiel dafür, dass man ständig damit rechnen musste hinterrücks erdolcht zu werden. Zu seiner Zeit waren römische Truppen in ganz Europa auf Eroberungszügen unterwegs. Früher gab es keine andere Möglichkeit Botschaften an die Front zu verschicken als per Brief. Cäsar ahnte schon vor seinem Tod, dass die Feinde nicht nur auf dem Schlachtfeld lauerten, sondern durchaus auch in den eigenen Reihen spioniert wurde. Vielleicht ist das der Grund warum man ihm nachsagt seine Briefe angeblich mit dem „Cäsar Chiffre“ verschlüsselt zu haben.

Doch wie funktioniert die Cäsar Verschlüsselung. Nun sie ist eine der unsichersten wenn nicht, die unsicherste Methode einen Text zu verschlüsseln. Doch bevor wir loslegen möchte ich zwei Dinge klar stellen.

  1. Ich möchte jedem meinen Post über die Berechnung des Modulo in C# ans Herz legen. Denn diese kann etwas trügerisch sein und unerwartete Werte für negative Zahlen liefern.
  2. Obwohl dies ein deutschsprachiger Blog ist werde ich in diesem Beitrag einfachheitshalber das englische Alphabet benutzen. Dies sollte jedoch kein Problem darstellen, denn der Code sollte sich recht schnell und leicht umschreiben lassen um deutsche Texte zu verschlüsseln. Vielleicht ist das auch eine kleine Übung die man machen könnte um den Cäsar Chiffre besser zu verstehen.

Wer Zeit sparen möchte kann sich mein Video zu diesem Thema angucken. Ansonsten werde ich in Folgendem ein ausführliches Beispiel bringen und erklären.

So nun aber los. Nehmen wir das englische Alphabet und versehen jeden Buchstaben mit einem Index.

alphabet

Zuerst brauchen wir einen Schlüssel den wir benutzen wollen um einen Text zu chiffrieren. Also wählen wir K=3. Dann brauchen wir natürlich auch ein Wort, dass wir verschlüsseln. Dafür nehmen wir einfachheitshalber ‚bob‘, dabei soll Groß und Kleinschreibung keine Rolle spielen. Nun macht der Cäsar Chiffre nichts anderes als die Indizes der Buchstaben um den Schlüssel zu verschieben.

K = 3

T = ‚bob‘

B=2; 2+3=5=E
O=15; 15+3=18=R
B=2; 2+3=5=E

Cäsar(‚bob‘,3) → ‚ere‘

Sprich, bei einem Schlüssel von K=3 wird jeder Buchstabe im Klartext ‚bob‘ um drei Stellen nach rechts verschoben und liefert ‚ere‘ als Ergebnis. Natürlich kann der Schlüssel auch negative Werte annehmen, dann wird entsprechend nach links verschoben. Mathematisch ist die Cäsar Verschlüsselung wie folgt definiert:

Verschlüsselung(P) = (P+K) mod 26

Wobei P dem Index eines Buchstaben im Klartext entspricht und K dem gewünschten Schlüssel. Da unser Alphabet 26 Buchstaben enthält rechnen wir mod 26, dadurch können für K Werte genommen werden die die Anzahl der Buchstaben im Alphabet übersteigen. Beispielsweise, für P = ‚b‘ und K = 116:

Verschlüsselung(2) = (2 + 116) mod 26 = 118 mod 26 = 14 → ’n‘

Hier ist es wichtig den Modulo zu benutzen und nicht den Rest zu berechnen, weil es sonst zu falschen  Werten bei der Berechnung führen kann (mehr dazu hier). Ebenfalls simpel lassen sich Texte auch wieder entschlüsseln, vorausgesetzt man kennt den passenden Schlüssel.

Entschlüsselung(P) = (P-K) mod 26

So können wir den Buchstaben ’n‘ wieder mit K = 116 entschlüsseln:

Entschlüsselung (14) = (14 – 116) mod 26 = -102 mod 26 = 2 → ‚b‘

Da nur ein einzelnes Alphabet zur Verschlüsselung verwendet wird handelt es sich hier um eine mono-alphabetische Verschlüsselung. Diese ist sehr leicht zu entschlüsseln auch ohne Kenntnis des dazugehörigen Schlüssels. Dies liegt einfach daran, dass es nur 26 mögliche Schlüssel gibt. Dementsprechend kommt man durch ausprobieren sehr schnell an den Klartext. Benutzt man zusätzlich eine Frequenzanalyse, kann man den Schlüssel sogar sofort erkennen.

Hier ist eine die Verschlüsselungsmethode encryptTextEng()

//Die Methode bekommt den klartext und einen Schlüssel als Parameter
        public static string encryptTextEng(string plainText, int keyValue)
        {
            string encText = ""; //Hier wird der verschlüsselte Text gespeichert
            char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

            //Iteriere durch jedes Zeichen im Klartext
            foreach (char c in plainText.ToUpper())
            {
                //Prüfe ob das Zeichen ein Buchstabe im Alphabet ist
                if (alphabet.Contains(c))
                {
                    //Wenn ja, berechne die neue Position und füge den neuen Buchstaben
                    //dem verschlüsselten Text hinzu
                    encText += alphabet[Mod((Array.IndexOf(alphabet, c) + keyValue), 26)];
                }
                else
                {
                    //Ansonsten übernehme das zeichen
                    //Beispielsweise Leerzeichen, Satzzeichen...
                    encText += c;
                }
            }

            return encText;
        }

Die Methode Mod könnt ihr euch gerne hier angucken. Die Entschlüsselungsmethode würde eigentlich genauso aussehen, nur in Zeile 15 würden wir nicht.

 Mod((Array.IndexOf(alphabet, c) + keyValue), 26)

sondern

Mod((Array.IndexOf(alphabet, c) keyValue), 26)

rechnen.

Advertisements
Dieser Beitrag wurde unter .NET, Algorithmen, Beispiel, Beispiel, c#, Chiffre, Kryptologie, Mathematik, Modulo, Programmierung, verschlüsselung veröffentlicht. Setze ein Lesezeichen auf den Permalink.

3 Antworten zu Caesar Chiffre/Verschlüsselung in C#

  1. Pingback: Frequenzanalyse in C# | RealityBites

  2. Pingback: Die Vigenère-Verschlüsselung in C# | RealityBites

  3. Pingback: Die Playfair Verschlüsselung in C# | RealityBites

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

w

Verbinde mit %s