Einführung in das Binärsystem am Beispiel der XOR Verschlüsselung in C#

Das XOR Verfahren ist an sich trivial. Deshalb beginne ich den Artikel mit einem Crashkurs zum Binärsystem und einigen der dazu gehörenden Operatoren.

Eine Maschine verarbeitet Informationen in Form von Binärfolgen. Das heißt, dass Information als eine Folge der Zahlen 1 und 0 (true und false) dargestellt wird. Der Computer kann diese Folgen als Zahlen interpretieren. So entspricht die Zahl 42 im Binärsystem der Folge 101010.

Um 42 von dezimal nach binär umzurechnen, teilen wir unsere Zahl immer wieder durch zwei und notieren uns dabei die Modulo Werte.

42 / 2 = 21        | 0

21 / 2 = 10        | 1

10 / 2 = 5          | 0

5 / 2 = 2           | 1

2 / 2 = 1           | 0

1 / 2 = 0           | 1

Jetzt können wir an den Restwerten die Binärdarstellung der Zahl 42 von unten nach oben ablesen, also 101010. Um es noch etwas anschaulicher zu machen kann man sich diese Darstellung als eine Folge von zweier Potenzen vorstellen.

binary

Nun möchte man aber nicht nur Zahlen abbilden sondern auch Textzeichen. Hierbei werden Daten meist als Folge von acht Bit bzw. einem Byte dargestellt. Also besteht ein Byte aus acht Einsen oder Nullen und kann somit insgesamt 28 Werte annehmen. Diese Werte können benutzt werden um Zeichen zu repräsentieren bzw. zu codieren. Wie es beispielsweise mit den ASCII Zeichen gemacht wird. So steht die Zahl 42 beispielsweise für ‚*‘.

ascii

ASCII-Zeichen mit den entsprechenden Dezimalwerten. (Bildquelle)

Binärfolgen lassen sich aber auch manipulieren. Hierfür gibt es mehrere Operatoren die aus dem Gebiet der Logik stammen und auf Bits bzw. Bytes angewandt werden können. Gehen wir einige dieser Operatoren kurz durch.

Und-Operator (AND)

Nehmen wir zwei Bits 1 und 0. So liefert der Und-Operator 0. Nehmen wir 1 und 1 so liefert der Operator 1. Wir sehen also beide Bits müssen true sein damit der Und-Operator 1 liefert, denn ‚Wahr UND Wahr‘ ist ‚Wahr‘. Wir verwenden das Zeichen für das logische Und ‚˄‘ welches sonst auch als ‚&&‘ in C# beschrieben werden kann. Die möglichen Kombinationen für diesen Operator sehen wie folgt aus.

1 ˄ 1 = 1

1 ˄ 0 = 0

0 ˄ 1 = 0

0 ˄ 0 = 0

Oder-Operator (OR)

Im Gegensatz zum Und-Operator müssen bei dem Oder-Operator nicht unbedingt beide Werte wahr sein. Es können aber auch beide Werte wahr sein. Das logische Oder wird als ‚˅‘ dargestellt oder alternativ als ‚||‘ in C#. So ergeben sich folgende Kombinationen.

1 ˅ 1 = 1

1 ˅ 0 = 1

0 ˅ 1 = 1

0 ˅ 0 = 0

XOR-Operator (entweder..oder)

Im Gegensatz zum Oder-Operator ist XOR ein wörtliches „entweder … oder …“ und wird auch als „exklusives oder“ bezeichnet. So darf entweder nur das eine oder nur das andere Bit wahr sein. In C# ist ‚^‘ der Operator für ‚entweder oder‘, wir verwenden XOR.

1 XOR 1 = 0

1 XOR 0 = 1

0 XOR 1 = 1

0 XOR 0 = 0

Eben dieser XOR-Operator kann dazu benutzt werden um Klartext zu chiffrieren. Nun da wir wissen wie Zeichen binär dargestellt werden können und wie das XOR funktioniert, können wir folgendes Beispiel betrachten.

 Klartext: ‚Geheimnis

Schlüssel: ‚Code

Wir verschlüsseln das Wort ‚Geheimnis‘ mit Hilfe des Schlüsselwortes ‚Code‘. Also nehmen wir als erstes den Buchstaben ‚G‘. Wenn wir nun in der ASCII Tabelle nachschauen sehen wir, dass ‚G‘ den Wert 71 hat. Der Schlüsselbuchstabe C entspricht dem ASCII Wert 67. Um die XOR-Verschlüsselung anzuwenden müssen die jeweiligen Zeichen Binär dargestellt werden.

ascii_bin

Und nun wenden wir auf diese Binärzahlen den XOR-Operator an:

GC

Also ist das erste Zeichen des verschlüsselten Textes 4. Und so machen wir Zeichen für Zeichen weiter. Als nächstes wird der Buchstabe ‚e‘ mit dem Buchstaben ‚o‘ verschlüsselt.

XOR

Sollte der Schlüssel nicht lang genug sein, kann dieser erweitert werden. So ergibt sich folgende Verschlüsselung:

XORcomplete

Somit entspricht der Verschlüsselte Text der Zahlenfolge {4,10, 12, 0, 42, 2, 10, 12, 48}. Glücklicherweise macht es das .NET-Framework einem leicht die XOR-Verschlüsselung zu implementieren. Wichtig dabei ist, dass wir gleich am Anfang der Methode EncryptXOREng() die Methode AdjustKeyLength() benutzen um den Schlüssel wie im obigen Beispiel zu verlängern. Diese Methode findet ihr hier. Die verschlüsselungs Methode liefert uns ein Array welches die einzelnen Zahlen des Chiffre enthält.

//Die methode bekommt den Klartext und den Schlüsseltext als Parameter
        public static byte[] EncryptXOREng(string plainText,string keyText)
        {
            //Diese Methode benutzen wir um die Lägne des Schlüsseltextes
            //an die des Klartextes anzupassen.
            keyText = AdjustKeyLength(plainText,keyText);

            //Mit diesem Befehl zaubern wir aus dem Klartext ein array,
            //welches die Indizes der ASCII Zeichen aus dem Klartext enthält.
            byte[] binaryPlainText = System.Text.Encoding.ASCII.GetBytes(plainText);

            //Mit diesem Befehl zaubern wir aus dem Schlüsseltext ein array,
            //welches die Indizes der ASCII Zeichen aus dem Schlüsseltext enthält.
            byte[] binaryKeyText = System.Text.Encoding.ASCII.GetBytes(keyText);

            //Nun iterieren wir durch jedes Zeichen im Klartext.
            for(int i = 0;i<plainText.Length;i++)
            {
                // Mit dem Befehl '^' verschlüsseln wir jeden Buchstaben im KlarText,
                //mit dem entsprechenden Buchstaben des Schlüsseltextes
                binaryPlainText[i] ^=  binaryKeyText[i];
            }

            //Der Rückgabewert ist ein überschriebenes byte-array welches die Verschlüsselung
            //als Folge ganzer Zahlen enthält.
            return binaryPlainText;
        }

Die XOR-Verschlüsselung ist symmetrisch. Das bedeutet, dass wir entschlüsseln können indem wir den XOR-Operator diesmal auf Chiffre und Schlüsseltext anwenden. Um eine XOR-Chiffre mit einem gegebenen Schlüsseltext wieder zu entschlüsseln benutzen wir die Methode DecryptXOREng().

//Die methode bekommt das Zahlen-Array der Chiffre und den Schlüsseltext als Parameter
        public static string DecryptXOREng(byte[] chiffreNumberArray, string keyText)
        {
            //Hier werden wir den entschlüsselten Text speichern
            string plainText;

            //Um die AdjustKeyLength()-Methode u benutzen müssen wir die Länge des Klartextes
            //aus der Länge des Chiffre-Array auslesen. Dazu erstellen wir ein string-Array
            //mit der Länge des Chiffre-Array.
            string[] cipher = new string[chiffreNumberArray.Length];

            //Diese Methode benutzen wir um die Lägne des Schlüsseltextes
            //an die des Klartextes anzupassen.
            keyText = AdjustKeyLength(cipher.ToString(), keyText);

            //Mit diesem Befehl zaubern wir aus dem Schlüsseltext ein array,
            //welches die Indizes der ASCII Zeichen aus dem Schlüsseltext enthält.
            byte[] binaryKeyText = System.Text.Encoding.ASCII.GetBytes(keyText);

            //Nun iterieren wir durch jeden Eintrag im Chiffre.
            for (int i = 0; i < chiffreNumberArray.Length; i++)
            {
                //Mit dem Befehl '^' entschlüsseln wir jeden Eintrag im Chiffre,
                //mit dem entsprechenden Eintrag des Schlüsseltextes.
                chiffreNumberArray[i] ^= binaryKeyText[i];

            }

            //Hier wandeln wir jeden Eintrag im Chiffre-Array von Zahl nach ASCII Zeichen.
            plainText = System.Text.Encoding.ASCII.GetString(chiffreNumberArray);

            //Unser Rückgabewert ist der entschlüsselte Klartext.
            return plainText;
        }
Advertisements
Dieser Beitrag wurde unter .NET, Algorithmen, Beispiel, Beispiel, c#, Chiffre, Kryptologie, Mathematik, Modulo, Modulo, Programmierung, Remainder, Rest, Uncategorized, verschlüsselung abgelegt und mit , , , , , , , , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Eine Antwort zu Einführung in das Binärsystem am Beispiel der XOR Verschlüsselung in C#

  1. You cannt stop us IllUmInatI schreibt:

    Danke Super Hilfreich =)

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