Seiten

Dienstag, 10. Mai 2011

Teil 2: Spaltentransposition Chiffre mit "CubeCrypt 2011" - Verwendung von "CubeCrypt 2011"

Dies ist der zweite Teil der dreiteiligen Artikelserie über das Tool "CubeCrypt 2011". Dieser zweite Teil zeigt die Verwendung von "CubeCrypt 2011". Hier sind nochmal alle Teile der Artikelserie in der Übersicht:

Teil 1: Das Verfahren der "Spaltentransposition"
Teil 2: Verwendung von "CubeCrypt 2011"
Teil 3: Kryptologie und Kryptanalyse der "Spaltentransposition" (noch nicht veröffentlicht)

Dieser zweite Teil behandelt die Verwendung von "CubeCrypt 2011" und die Implementierung des Werkzeugs in eine Silverlight-Anwendung. Im Abschnitt "Implementierung mit Datenbindung" zeige ich eine Lösung auf, wie man "CubeCrypt 2011" auch im Rahmen einer Datenbindung nutzen kann, ohne dass im Quellcode (weder Xaml noch C# oder VB) ein Klartext-Passwort vorhanden ist.


Implementierung von "CubeCrypt 2011" für Silverlight


"CubeCrypt 2011" ist eine Silverlight-Assembly. Sie ist verfügbar als Bestandteil des Beispielprojekts, das in der Expression Gallery heruntergeladen werden kann. Die Assembly heißt CubeCrypt.dll. Um "CubeCrypt 2011" zu verwenden, muss zu einem Silverlight 4-Projekt ein Verweis auf die Datei CubeCrypt.dll hinzugefügt werden. Außerdem muss in der Klasse, in der CubeCrypt verwendet wird, eine Imports-Anweisung für den Namespace "ColumnarTransposition" hinzugefügt werden.

Imports ColumnarTransposition
Imports ColumnarTransposition.CubeCrypt

Um mit CubeCrypt eine Zeichenfolge zu verschlüsseln oder zu entschlüsseln, muss zunächst ein neues CubeCrypt-Objekt (Namespace ColumnTransposition) erstellt werden. Der Konstruktor der neuen Objektinstanz erfordert die Übergabe eines Parameters. Dieser Parameter erfordert entweder die Übergabe eines Wertes vom Typ "EncryptionMode" oder die Übergabe eines Werts vom Typ "DecryptionMode". Die Übergabe eines Wertes vom Typ "EncryptionMode'" erzeugt eine Objektinstanz, die zum Verschlüsseln einer Zeichenfolge benutzt werden kann. Die Übergabe eines Wertes vom Typ "DecryptionMode'" erzeugt eine Objektinstanz, die zum Entschlüsseln einer Zeichenfolge benutzt werden kann.

EncryptionMode und DecryptionMode sind jeweils vom Typ Enum. EncryptionMode kennt die beiden Werte EncryptionMode.SingleEncryption und EncryptionMode.DoubleEncryption. DecryptionMode kennt die beiden Werte DecryptionMode.SingleDecryption und DecryptionMode.DoubleDecryption. Die Auswahl des Enumerationswertes entscheidet darüber, ob die Verschlüsselung bzw. die Entschlüsselung mit einer einzelnen Spaltentransposition erfolgen soll, oder ob die Verschlüsselung bzw. die Entschlüsselung mit einer doppelten Spaltentransposition erfolgen soll. Die folgenden Grafiken veranschaulichen das:

Abbildung 1: Enum: EncryptionMode (Namespace: ColumnarTransposition. Class: CubeCrypt)

Abbildung 2: Enum: DecryptionMode (Namespace: ColumnarTransposition. Class: CubeCrypt)

Verschlüsselung

Die Klasse CubeCrypt stellt die öffentliche Methode Encrypt() zur Verfügung. Die Methode Encrypt() ist überladen. Der Methode wird als Parameter der Klartext übergeben und zusätzlich entweder ein oder zwei Passworte. Abhängig davon, ob der Methode Encrypt() ein oder zwei Passworte übergeben wird, wird der Klartext entweder mit einer einzelnen Spaltentransposition verschlüsselt oder er wird mit einer doppelten Spaltentransposition verschlüsselt. Der Geheimtext wird, wiederum abhängig davon, ob eine einzelne Spaltentransposition durchgeführt wurde, oder ob eine doppelte Spaltentransposition durchgeführt wurde, von den Eigenschaften SingleEncyrptedCiphertext oder DoubleEncryptedCiphertext zurückgegeben. Die Eigenschaften SingleEncyrptedCiphertext und DoubleEncryptedCiphertext sind beide ReadOnly. Der nachfolgende Quellcode verdeutlicht diese Logik:

Beispiel-Quellcode:
  Private Function EncryptString(ByVal plaintext As String,
                                 ByVal pw1 As String,
                                 ByVal pw2 As String) As String

    Dim rv As String

    If String.IsNullOrEmpty(pw2) Then

      Dim ct As New CubeCrypt(EncryptionMode.SingleEncryption)

      ct.Encrypt(plaintext, pw1)

      rv = ct.SingleEncryptedCipherText

    Else

      Dim ct As New CubeCrypt(EncryptionMode.DoubleEncryption)

      ct.Encrypt(plaintext, pw1, pw2)

      rv = ct.DoubleEncryptedCipherText

    End If

    Return rv

  End Function

Entschlüsselung

Der Vorgang der Entschlüsselung erfolgt entsprechend der Logik der Entschlüsselung. Im Unterschied zur Verschlüsselung, wird bei der Entschlüsselung eine Objektinstanz erzeugt, der als Parameter ein Wert vom Typ DecryptionMode übergeben wird. Die Entschlüsselung erfolgt mit der ebenfalls überladenen Methode "Decrypt()". Der Methode "Decrypt()" wird der Geheimtext übergeben. Außerdem werden ihr entweder ein einzelnes Passwort oder zwei Passworte übergeben. Der entschlüsselte Klartext wird entweder von der Eigenschaft SingleDecryptedPlaintext oder von der Eigenschaft DoubleDecryptedPlaintext zurückgegeben.

Beispiel-Quellcode:
  Private Function DecryptString(ByVal ciphertext As String,
                                 ByVal pw1 As String,
                                 ByVal pw2 As String) As String

    Dim rv As String

    If String.IsNullOrEmpty(pw2) Then

      Dim cr As New CubeCrypt(DecryptionMode.SingleDecryption)

      cr.Decrypt(ciphertext, pw1)

      rv = cr.SingleDecryptedPlainText

    Else

      Dim cr As New CubeCrypt(DecryptionMode.DoubleDecryption)

      cr.Decrypt(ciphertext, pw1, pw2)

      rv = cr.DoubleDecryptedPlainText

    End If

    Return rv

  End Function

Implementierung mit Datenbindung (Datenbindung von Element zu Element)

Die Beispielanwendung, die in der Expression Gallery zum Download bereitgestellt ist, verwendet Datenbindung. Die Implementierung der Verschlüsselung und der Entschlüsselung mittels Datenbindung ist ziemlich einfach.

In der Beispielanwendung ist es so, dass bei einer Texteingabe von Klartext oder bei der Eingabe eines Passwortes oder eines zweiten Passwortes automatisch der Geheimtext geändert wird. Klartext, Passwort1, Passwort2, Geheimtext und der wieder entschlüsselte Klartext sind jeweils in TextBox-Steuerelementen enthalten. Die TextBox-Steuerelemente kommunizieren über Datenbindung miteinander. Die TextBox, die den Geheimtext enthält, ist mit der "TextProperty"-Abhängigkeitseigenschaft datengebunden an die Text-Eigenschaft der TextBox, die den Klartext enthält. Die TextBox, die den entschlüsselten Klartext anzeigen soll, ist mit der "TextProperty"-Abhängigkeitseigenschaft datengebunden an die Text-Eigenschaft der Textbox, die den Geheimtext enthält. Die Datenbindung funktioniert über jeweils ein Binding-Objekt. Eingebunden in jede dieser Datenbindungen bzw. in das jeweilige Binding-Objekt ist ein jeweils unterschiedlicher Converter. Ein Converter (EncryptConverter.vb) ist für die Verschlüsselung zuständig, ein anderer Converter (DecryptConverter.vb) ist für die Entschlüsselung zuständig. Jedem Binding-Objekt wird zusätzlich ein Parameter-Wert übergeben. Dieser Parameter beinhaltet das Passwort bzw. die beiden Passworte. Der Wert für den ConverterParameter wird in der Funktion GetConverterParameter() zurückgegeben. Diese Funktion erzeugt den Parameter-Wert aus dem Inhalt der beiden TextBox-Steuerelemente, die die Passworte enthalten.

Die nachfolgenden Grafiken veranschaulichen diese Funktionsweise:

Abbildung 3: Logic of encryption using DataBinding element to element


Abbildung 4: Logic of encryption using DataBinding element to element

Bei einer Datenbindung von Element zu Element besteht im Rahmen einer Verschlüsselung ein grundsätzliches Problem. Wenn der ConverterParameter im Xaml-Quellcode angegeben ist, kann das Passwort leicht ausgelesen werden. Denn der ConverterParameter stellt das Passwort bzw. die Passworte zur Verfügung, die innerhalb der Converter für die Verschlüsselung bzw. für die Entschlüsselung benötigt werden. Dieses Problem habe ich in der Beispielanwendung so gelöst, dass ein lesbares Passwort im Xaml-Quellcode und auch im Code Behind nicht explizit auftaucht! Um das zu erreichen, wird das DataBindung vollständig im Code Behind implementiert. Jeder der beiden implementierten Converter bezieht die Passworte jeweils nur zur Laufzeit über den Inhalt der TextBox-Steuerelemente, die für die beiden Passworte vorgesehen sind. Um das zu erreichen, wird die Datenbindung mit jedem Feuern des TextChanged()-Ereignisses neu definiert. Das heißt, die Passworte werden dem Bindungsobjekt jedesmal neu übergeben, wenn sich der Text in einer der TextBox-Steuerelemente für die Passworte ändert.

Im Ergebnis dieses Modells der Datenbindung verbleiben die Passworte jeweils nur im Arbeitspeicher des Computers. Es erfolgt keine explizite Speicherung der Passworte auf einem dauerhaften Speicherträger. Ich möchte jedoch darauf hinweisen, dass Silverlight derzeit nicht die Klasse SecureString unterstützt. Es kann daher auch im Rahmen einer Datenbindung nur der normale String-Typ benutzt werden. Im Gegensatz zu einem SecureString erfolgt bei der Verwendung von einem normalen String keine automatische Verschlüsselung des Werts der Zeichenfolge. Das ist allerdings eine allgemeine Einschränkung, die bei Silverlight derzeit hingenommen werden muss.

Den Quellcode der Beispielanwendung, die das beschriebene Modell der Datenbindung von Element zu Element implementiert, steht in der Expression Gallery zum Download bereit.

Über Feedback, Fragen und Anregungen würde ich mich sehr freuen. Bitte schickt mir eine E-Mail an silverlaw [at] t-online.de oder schreibt einen Kommentar zu diesem Artikel.

Im nächsten Artikel dieser Reihe werde ich ausführlich die Kryptologie und die Kryptanalyse des Verfahrens der Spaltentransposition darstellen. Das wird eine spannende Reise.

Bis dahin .... Viel Spass mit "CubeCrypt 2011".

Kommentare:

  1. sehr schöner beitrag und gut erklärt :)
    wann kommt teil 3?

    bin neugirig wie man das knackt
    soll ja eins der sichersten verfahren sein die man noch von hand machen kann

    mfg

    AntwortenLöschen
  2. Hallo Anonym,

    vielen Dank für Dein Feedback.

    Zu Deiner Frage: Ich bin im Moment leider beruflich stark eingebunden und kann daher noch nicht sagen, wann Teil 3 kommt. Es werden aber wahrscheinlich noch mehrere Teile kommen. Unter anderem werde ich auch ein Silverlight-Tool zur Kryptanalyse der einfachen Spaltentransposition bereitstellen.

    Beste Grüße,
    Martin

    AntwortenLöschen