Habe mir folgenden Tipp zum Verschlüsseln mit Vernam mal angeschaut, um etwas Text zu verschlüsseln.
http://www.vbarchiv.net/tipps/details.php?id=564
Außerdem wollte ich das Ganze ohne String-Variablen d.h. nur mit TextBoxen ausführen, um den verschlüsselten
Text anzuzeigen, markieren und kopieren zu können.
Bei den Tests sind mir dann aber zwei Sachen aufgefallen, welche man noch ändern muss, damit es auch klappt.
1. Wenn man die Verschlüsselung startet und kein Passwort eingegeben hat, kommt der Laufzeitfehler 5.
2. Zur Ausgabe des verschlüsselten Textes können nur String-Variablen genommen werden, da unter
gewissen Umständen die Ausgabe in eine TextBox nicht fehlerfrei ist (sh. folgende Beschreibung).
Bei der Umsetzung mit der Vernam-Funktion, wird bei zufälliger Übereinstimmung von einzelnen Zeichen
( z.B. ein „A“ an der gleichen Stelle im Passwort und im Originaltext ) im verschlüsselten Vernam-Code ein
NULL-Zeichen ( Chr(0) ) gesetzt.
Dies ist, wenn man den kompletten Code in eine String-Variable speichert ohne Bedeutung, da dort auch das
NULL-Zeichen mit gespeichert wird.
Nimmt man jedoch anstatt der String-Variablen dazu TextBoxen, oder auch Label, zur direkten Ausgabe bzw.
danach zur weiteren Nutzung des verschlüsselten Vernam-Codes, funktioniert das Ganze nicht mehr, da das
NULL-Zeichen in einer TextBox nicht dargestellt werden kann, aber auch im Zusammenhang mit Text als
Terminator verwendet wird und hier den Text ab der Stelle des ersten NULL-Zeichens abschneidet/terminiert.
(d.h. der Rest wird nicht mehr angezeigt)
Dies passiert aber auch wenn man die String-Variable in eine TextBox schiebt z.B. Text1.Text = String-Variable.
Ein Entschlüsseln dieses TextBox-Textes ist dann nicht mehr möglich, da der Text ja nur noch teilweise vorliegt.
Am Rande sei noch erwähnt, dass die Anzeige in einer MsgBox hierbei auch nicht korrekt ist.
Nun zu den Änderungen des Codes in der Vernam-Funktion um dies abzustellen:
Als Erstes eine Abfrage ob ein Originaltext oder ein Passwort eingegeben wurde. Wenn nicht, dann „Exit Funktion“.
Dann wird bei Übereinstimmung kein NULL-Zeichen mehr gesetzt, sondern stattdessen das Zeichen, welchen an
dieser Stelle übereinstimmte.
Einen Nachteil hat diese Ausführung aber dennoch (Dies wird zwar normalerweise nie vorkommen, aber ???).
Ist das Passwort gleich dem Originaltext, ist der verschlüsselte Text ebenfalls der gleiche wie der Originaltext.
Als Beispiel folgendes:
Ist der Originaltext = „Mustertext“ und das Passwort = „Mustertext“, ist auch die Verschlüsselung = „Mustertext“.
Um das dann noch abzustellen, wurde zusätzlich noch eine Verschiebung der Zeichen im Passwort vorgenommen.
Und nun der Code der überarbeiteten Vernam-Funktion, wobei die Änderungen gegenüber dem Original-Code
„fett“ dargestellt werden.
' Textverschlüsselung mit VernamCode
Public Function VernamCode(sOriginal As String, _
sPassword As String) As String
' wenn nichts angegeben, wird auch nichts ver/entschlüsselt
If sPassword = "" Or sOriginal = "" Then Exit Function
Dim i As Long
Dim aktpos As Long
Dim bAkt As Byte
Dim bCode As Byte
Dim bPassword As String
VernamCode = ""
bPassword = ""
' Passwort auf die Länge des Originals bringen
' Aus "Passwort" wird dann "PasswortPasswortPas....usw."
aktpos = 1
For i = Len(sPassword) + 1 To Len(sOriginal)
sPassword = sPassword & Mid(sPassword, aktpos, 1)
aktpos = aktpos + 1
If aktpos > Len(sPassword) Then aktpos = 1
Next i
' einzelne Zeichen des Passwortes nochmals tauschen
aktpos = 1
For i = 1 To Len(sPassword)
bPassword = bPassword & Chr(Asc(Mid(sPassword, i, 1)) - aktpos)
aktpos = aktpos + 1
If aktpos = 29 Then aktpos = 1
Next i
' Verschlüsselung
For i = 1 To Len(sOriginal)
bAkt = Asc(Mid(sOriginal, i, 1))
bCode = Asc(Mid(bPassword, i, 1))
If bAkt = bCode Then
VernamCode = VernamCode & Chr(bAkt)
Else
VernamCode = VernamCode & Chr(bAkt Xor bCode)
End If
Next i
End Function Damit dürfte die Vernam-Funktion dann wohl in allen Situationen einsetzbar sein.
Als Letztes dann noch der Aufruf der Vernam-Funktion nur mit TextBoxen:
Private Sub cmdVerschlüsseln_Click()
Text3.Text = VernamCode(Text1.Text, Text2.Text)
End Sub
Private Sub cmdEntschlüsseln_Click()
Text4.Text = VernamCode(Text3.Text, Text2.Text)
End Sub Sollte es noch etwas zum Verbessern geben, bitte melden.
Euch allen noch einen guten Rutsch und ein gesundes erfolgreiches neues Jahr.
Gruß JAG
PS.
Ein kleines Testprogramm (EXE) hierzu kann ich Interessenten zusenden.
(Bin ab 01.01.2009 ca. 3 1/2 Wochen nicht erreichbar) |