| |
| In diesem Forum haben Sie die Möglichkeit Kommentare, Fragen und Verbesserungsvorschläge zu den im vb@rchiv gelisteten Tipps und Workshops zu posten.
Hinweis: Ein neues Thema kann immer nur über die jeweilige Tipps & Tricks bzw. Workshop Seite eröffnet werden! | Fragen zu Tipps & Tricks und Workshops im vb@rchivTipp 564: Sichere Verschlüsselung (Vernam-Algorithmus) | | | Autor: JAG | Tipp anzeigenDatum: 29.12.08 12:43 |
| 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) | |
Sichere Verschlüsselung (Vernam-Algorithmus) | | | Autor: NiWa | Datum: 18.09.10 19:10 |
| Die gezeigte Verschlüsselung ist kein Vernam-Algorithmus, sondern eine simple XOR-Verschlüsselung. Der Vernam-Algorithmus gilt deswegen als mathematisch sicher, weil auf ein Klartextzeichen immer mindestens ein Passwortzeichen kommt. Wenn man beim hier gezeigten Algorithmus ein 10 Zeichen langes Passwort verwendet und einen 100 Zeichen langen Klartext hat, kann man schon mit einem Zeichen vom Passwort 10% des Klartextes herausfinden. Genau diese Unzulänglichkeiten behebt der echte Vernam-Algorithmus, was aber dazu führt, dass man für lange Texte auch lange Passwörter braucht. Deshalb werden heute fast immer wie in diesem Beispiel gekürzte Passwörter verwendet, die aber nicht mathematisch sicher sind und damit auch nicht dem Vernam-Algorithmus entsprechen.
Mathematisch sicher bedeutet, dass man ohne Passwort den Klartext nicht sehen kann. Im originalen Vernam-Algorithmus bedeutet das, dass man selbst mit einem teil vom Passwort auch nur den entsprechenden Teil des Klartextes sehen kann, bei der hier abgeschwächten Variante währen "rhythmisch" immer wieder Fragmente zu sehen, immer an den Stellen, an denen sich das Passwort wiederholt. | |
Re: Sichere Verschlüsselung (Vernam-Algorithmus) | | | Autor: NiWa | Datum: 18.09.10 20:22 |
| Das entspricht in etwa dem, was ich gesagt hab.
> "Vernam" oder "one time pad" ist also bei üblicher praxis völlig unbrauchbar.
Ich hab ein Verfahren entwickelt, das bei annehmbarer Schlüssellänge die Vorteile beider Algorithmen kombiniert.
Dabei wird aus einem kurzen Key ein beliebig langer Key generiert, der dann für die Verschlüsselung mit Vernam verwendet werden kann. Dabei wird der Key allerdings nicht simpel wiederholt, sondern auf diverse Arten verlängert. Während dieser Verlängerung verändert jedes einzelne Bit im kurzen Key jedes Bit im langen Key drastisch, so dass man mit fast kompletten Keys ebenfalls nur Müll rausbekommt. Dieser Kompromiss aus Keylänge und Sicherheit ist imho akzeptabel | |
| Sie sind nicht angemeldet! Um einen neuen Beitrag schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|