Kodieren und Dekodieren von Texten

By , 8. April 2012

Kürzlich bin ich auf eine relativ alte Methode wieder gestoßen um Texte zu kodieren. Dabei verschiebt man einfach die Buchstaben im Wort um eine definierte Anzahl stellen. Ein bekannter Vertreter dieser Art ist Rot13. (Rotate by 13). Solche Kodierer haben den Vorteil dass sie erstens wieder dekodiert werden können – was gleichzeitig aber auch ihr Nachteil in Bezug auf Sicherheit ist – und zweitens dass es bekannte Algorithmen in verschiedenen Programmiersprachen gibt. Teilweise findet man auch im internet Online-Tools die Texte kodieren bzw. dekodieren können.
Dies sollte man wissen wenn man Text-Daten in einer Tabelle verschlüsseln möchte. Jeder der die Kodierungsmethode herausfindet kann es auch wieder lesbar machen.

Um hier ein wenig Sicherheit hineinzubringen sollte man den Kodier-Algorithmus nach eigenen Vorgaben anpassen. Über Ostern hatte ich wohl ein bisschen Zeit, und hab da mal etwas gebastel.
Meine Idee war kein fester Verschiebefaktor vorzugeben, sondern in Ahhängigkeit der Stelle eines Buchstabens im Wort vergrößerten Faktur. Also der erste Buchstabe um z.B. 15 verschieben, den zweiten um 15 usw., und beim nächsten Wort wieder bei 15 anfangen. Ich nenne diesen Algorithmus mal Rot15plus.

Fangen wir man zuerst bei der deklaration der benötigten Variablen an. diese sollten in einem separaten Modul im Deklarationsteil als private deklariert werden:
Wir brauchen verschiedene Zählvariablen i, k, zaehler. Dann einen Marker der speichert die info ob Großbuchstabe oder nicht: UpperCase. Stringvariablen für das einzelne Zeichen im Wort und das codierte/decodierte Zeichen, eine long-Variable laenge, die die Wortlänge aufnimmt und zum Schluss eine Arrayvariable arr1(), welche die erlaubten zu codierenden Buchstaben enthält.

Kodierer und Dekodierer trennen wir in 2 einzelne Funktionen die die Reichweite Public besitzen.

Dies ist der Kodierer. Das Array fängt bei Buchstabe a mit 1 an, deswegen der dummy-Wert. In einer Schleife über den gesamten Text wird bei jedem Durchgang das einzelne Zeichen geholt, die Position im Array ermittelt, um den Verschiebefaktor erhöht und als Zeichen wieder in den Text eingefügt. Zeichen außerhalb des Arrays werden nicht übersetzt, so bleibt die Zeichensetzung erhalten.

Public Function coder(ByVal strText As String) As String
    arr1 = Array("dummy", "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", "ä", "ö", "ü")
    strText = Trim$(strText)
    laenge = Len(strText)
    zaehler = 0
    For i = 1 To laenge
        strZeichen = Mid$(strText, i, 1)
        UpperCase = False
        k = arraySearch(arr1, strZeichen)
        If k > 0 Then
            If Asc(UCase$(strZeichen)) = Asc(strZeichen) Then UpperCase = True
            zaehler = zaehler + 1
            k = k + zaehler + 14
            If k > UBound(arr1) Then k = k - UBound(arr1)
            strZeichenCodiert = arr1(k)
            If UpperCase Then strZeichenCodiert = UCase$(strZeichenCodiert)
            strText = Left$(strText, i - 1) & strZeichenCodiert & Right$(strText, laenge - i)
        Else
            zaehler = 0
        End If
    Next i
    coder = strText
End Function

Das ist die Dekodierfunktion, im Prinzip das selbe wie oben, nur wird hier die Verschiebung rückgängig gemacht.

Public Function decoder(ByVal strText As String) As String
    arr1 = Array("dummy", "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", "ä", "ö", "ü")
    strText = Trim$(strText)
    laenge = Len(strText)
    zaehler = 0
    For i = 1 To laenge
        strZeichen = Mid$(strText, i, 1)
        UpperCase = False
        k = arraySearch(arr1, strZeichen)
        If k > 0 Then
            If Asc(UCase$(strZeichen)) = Asc(strZeichen) Then UpperCase = True
            zaehler = zaehler + 1
            k = k - zaehler - 14
            If k < 1 Then k = k + UBound(arr1)
            strZeichenCodiert = arr1(k)
            If UpperCase Then strZeichenCodiert = UCase$(strZeichenCodiert)
            strText = Left$(strText, i - 1) & strZeichenCodiert & Right$(strText, laenge - i)
        Else
            zaehler = 0
        End If
    Next i
    decoder = strText
End Function

Diese Funktion sucht den Buchstaben im Array und gibt die Position zurück oder 0

Private Function arraySearch(ByVal arr1 As Variant, ByVal search As String) As Long
    Dim i As Long
    For i = 1 To UBound(arr1)
        If arr1(i) = LCase$(search) Then
            arraySearch = i
            Exit Function
        End If
    Next i
End Function

Anwenden kann man das ganze jetzt auch noch. Dazu sollten ungebundene Formulare für die Eingabe oder Bearbeitung erstellt werden, und per db.Execute ein SQL-String ausgeführt werden. Dieser SQL-String könnte z.B. so aussehen:

strSQL = "Insert into tblAdressen (vorname, nachname, strasse, plz, ort) values ('" & _
         coder(Me.vorname) & "', '" & coder(Me.nachname) & "', '" & coder(Me.strasse) & _
         "', '" & Me.plz & "', '" & coder(Me.ort) & "')"

Formulare zum Anzeigen kann man gebunden ausführen, dazu einfach die Datenherkunft so abändern:

SELECT tblAdressen.ID, decoder([vorname]) AS cvorname, decoder([nachname]) AS cnachname, 
decoder([strasse]) AS cstrasse, tblAdressen.plz, decoder([ort]) AS cort
FROM tblAdressen;

Wer jetzt ein Blick auf die Tabelle wirft, wird zwar alles sehen, er wird aber nichts erkennen, und das ist dabei die Hauptsache:

Das ganze hat jetzt aber noch einen kleinen Haken. Wenn man die Tabelle öffnet und codierten Text absichtlich oder unabsichtlich ein wenig verändert, ist das Wort oder der Satz nicht mehr lesbar nach dem dekodieren. Daher sollte man jetzt nicht blind alles codieren, sondern nur ausgesuchte und sehr wichtige Informationen, die andere nicht sehen dürfen. Und zur Not hat man ja noch die Tagessicherung, die ja alle täglich machen.

Bis dahin
© Andreas Vogt 2012

OfficeFolders theme by Themocracy