Kontakt
DSVGO
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...
Nachfolgend werden zwei Rot13-Funktionen vorgestellt und mit deren Hilfe eine komfortable, kleine Rot13-Anwendung erstellt.
MsgBox Rot13("Hallo Welt!") 'ergibt "Unyyb Jryg!" MsgBox Rot13("Uremyvpura Tyüpxjhafpu, Ebg13 shaxgvbavreg!") 'ergibt ??? selbst ausprobieren!
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.
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).
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
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!
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
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