Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Sicherheit / Rot13

Schutz vor zufälligem Lesen mit Rot13

Einleitung

Motivation

Im Internet stolpert man immer mal wieder über die sogenannte "Rot13-Kodierung". Sie macht einen Text unleserlich, damit man den Inhalt nicht auf den ersten Blick erfahren kann.

Genutzt wird dies oft im Zusammenhang mit sogenannten "Spoilern", wo jemand z.B. den weiteren Fortgang einer Fernsehserie verrät, aber nicht sofort allen den Spaß verderben will. So kann jeder (durch Anwendung der Rot13-Kodierung) selbst entscheiden, ob er so neugierig sein will... Smile!

Nachfolgend werden zwei Rot13-Funktionen vorgestellt und mit deren Hilfe eine komfortable, kleine Rot13-Anwendung erstellt.

Beispiele
MsgBox Rot13("Hallo Welt!")
'ergibt "Unyyb Jryg!"

MsgBox Rot13("Uremyvpura Tyüpxjhafpu, Ebg13 shaxgvbavreg!")
'ergibt ??? selbst ausprobieren!

Ein Rot13-Programm

Motivation

In vielen Mail- und News-Readern ist die Rot13-Kodierung integriert, aber leider nicht in allen. Daher möchte ich hier kurz eine kleine aber hilfreiche Anwendung dafür erstellen.

In der fertigen Anwendung können Sie Text via Drag'n'Drop Rot13-kodieren lassen, aber auch die Zwischenablage und natürlich die Tastatureingabe benutzen.

Das Formular

Legen Sie ein neues VB-Projekt an. Auf dem Formular platzieren Sie am obigen Rand von links nach rechts die Schaltflächen cmdRot13 (Caption="&Rot13!"), cmdPaste (Caption="&Einfügen") und cmdClear (Caption="&Löschen"). Darunter platzieren Sie bitte am linken Rand eine TextBox txt (MultiLine=True, OLEDropMode=1-Manual).

Die Ereignis-Prozeduren

Fügen Sie folgenden Code ein, damit die Anwendung zum Leben erweckt werden kann:

'Inhalt von TextBox mit Rot13 kodieren:
Private Sub cmdRot13_Click()
  txt.Text = Rot13(txt.Text)
End Sub

'Zwischenablage Rot13-kodieren:
Private Sub cmdPaste_Click()
  txt.Text = Rot13(Clipboard.GetText)
End Sub

'TextBox löschen:
Private Sub cmdClear_Click()
  txt.Text = ""
End Sub

'Größe der TextBox an Formular anpassen:
Private Sub Form_Resize()
  On Error Resume Next
    txt.Width = ScaleWidth - txt.Left
    txt.Height = ScaleHeight - txt.Top
  On Error GoTo 0
End Sub

'Drag'n'Drop nur für Text erlauben:
Private Sub txt_OLEDragOver(Data As DataObject, Effect As Long, _
    Button As Integer, Shift As Integer, X As Single, Y As Single, _
    State As Integer)

  If Data.GetFormat(vbCFText) Then
    Effect = vbDropEffectCopy
  Else
    Effect = vbDropEffectNone
  End If
End Sub

'Ge-Drop-ten Text Rot13-kodieren:
Private Sub txt_OLEDragDrop(Data As DataObject, Effect As Long, _
    Button As Integer, Shift As Integer, X As Single, Y As Single)

  txt.Text = Rot13(Data.GetData(vbCFText))
End Sub
Das Ergebnis

Fügen Sie jetzt noch den nachfolgend gezeigten Rot13-Code ein und speichern Sie das Projekt. Wenn Sie das Programm starten, können Sie jederzeit via Drag'n'Drop, Zwischenablage oder auch manuell Text in die TextBox einfügen und Rot13-kodieren!

Code/Quelltext für Rot13

Das Prinzip

Das Prinzip der Rot13-Kodierung ist äußerst simpel, taugt daher auch nicht als echte Verschlüsselung. Jeder Buchstabe wird einfach um 13 Plätze im Alphabet verschoben, aus "A" wird "N", aus "B" wird "O", etc. pp.

Da "N" eins hinter "Z" landen würde, beginnt man dann wieder bei "A", aus "O" wird also "B", und aus "Z" schließlich "M". Deswegen führt die zweifache Anwendung von Rot13 auch wieder zum Originaltext:

Public Function Rot13(ByRef Text As String) As String
  Dim i As Long
  
  Rot13 = Text
  For i = 1 To Len(Text)
    Select Case UCase$(Mid$(Text, i, 1))
    Case "A" To "M"
      Mid$(Rot13, i) = Chr$(Asc(Mid$(Text, i, 1)) + 13)
    Case "N" To "Z"
      Mid$(Rot13, i) = Chr$(Asc(Mid$(Text, i, 1)) - 13)
    End Select
  Next i
End Function
Optimierte Version

Im Deklarationsteil müssen wieder die üblichen API-Routinen zur "Zeiger-Verbiegung" bekannt gemacht werden:

Private Declare Function ArrPtr Lib "msvbvm50.dll" _
    Alias "VarPtr" (Ptr() As Any) As Long '<-- VB5
Private Declare Function ArrPtr Lib "msvbvm60.dll" _
    Alias "VarPtr" (Ptr() As Any) As Long '<-- VB6
Private Declare Sub PokeLng Lib "kernel32" Alias "RtlMoveMemory" ( _
    ByVal dest As Long, source As Long, _
    Optional ByVal bytes As Long = 4)

Die eigentliche Funktion greift die in "Strings blitzschnell ver- und entschlüsseln" erklärte Technik auf, um blitzschnell die Rot13-Kodierung durchzuführen. Dadurch wird die Funktion (je nach Text-Länge) 30-100 mal schneller als die oben gezeigte Version:

Public Function Rot13(ByRef Text As String) As String
  Static Chars() As Integer 'Unicode-Darstellung des Textes
  Static SavePtr As Long    'Safe Array Descriptor und co.
  Static Pointer As Long
  Dim i As Long
  
  'Ggf. Integer-Array einrichten:
  If Pointer = 0& Then
    ReDim Chars(1& To 1&)
    SavePtr = VarPtr(Chars(1))
    PokeLng VarPtr(Pointer), ByVal ArrPtr(Chars)
    PokeLng Pointer + 16&, &H7FFFFFFF 'längstmöglicher String
    Pointer = Pointer + 12&
  End If
  
  'String durch Integer-Array mappen:
  Rot13 = Text
  PokeLng Pointer, StrPtr(Rot13)
  
  'Rot13 durchführen:
  For i = 1& To Len(Rot13)
    Select Case Chars(i)
    Case 65 To 77, 97 To 109  'A-M
      Chars(i) = Chars(i) + 13
    Case 78 To 90, 110 To 122 'N-Z
      Chars(i) = Chars(i) - 13
    End Select
  Next i
  
  'Mapping zurücknehmen:
  PokeLng Pointer, SavePtr
End Function

© Jost Schwider, 09.12.2001-09.12.2001 - http://vb-tec.de/rot13.htm