mathe172
Goto Top

Selbsterfundener Codier- oder Verschlüsselungdsalgorythmus mit Erklärung - VB.NET

Ich habe mich vor einiger Zeit entschlossen, ein Verschlüsselungssytem, das ich vor Jahren erfunden habe, in VB.net zu schreiben

Hallo zusammen!
Hier ist der Komplette Code mit Ver- und Entschlüsselungssub(Achtung: Der Code ist für ein UserForm gemacht, sollte sich aber leicht umändern lassen):

[EDIT: Der Code wurde durch eine neue Version mit verbesserter Erklärung, Aufteilung in Form- und Nutzcode,weniger globalen Variablen und einer kleinen Fehlerroutine ersetzt]

"FormCode":
Public Class Form1
    'Variablen für Klar- und CodeText und Schlüssel  
    Dim KText As String
    Dim CText As String
    Dim Key As String
    'Benutztes Alphabet; Zeichensatz  
    Dim Alphabet As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz.,-_!?()^'äöü0123456789"  

    'Coder definieren  
    Dim WithEvents Coder As New Coder(Alphabet)
    Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
        'Alles leeren  
        Schlüssel.Text = ""  
        Key = ""  
        CodeText.Text = ""  
        CText = ""  
        'Überprüfen ob KlarText leer ist, wenn ja, Fehler melden,  
        ' Fokus auf Klartext und Sub abbrechen  
        If KlarText.Text <> "" Then  
            KText = KlarText.Text
        Else
            MsgBox("Bitte Klartext eingeben.")  
            KlarText.Focus()
            Exit Sub
        End If
        'Text mit Coder(-Funktionen) verschlüsseln  
        CodeText.Text = Coder.Encrypt(KText)
        Schlüssel.Text = Coder.Key
        'Bei Fehler Ausgaben löschen  
        If Fehler Then
            Fehler = False
            CodeText.Text = "Fehler aufgetreten"  
            Schlüssel.Text = "Fehler aufgetreten"  
        End If
    End Sub

    Private Sub Entschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Entschlüsseln.Click
        'Alles leeren  
        KlarText.Text = ""  
        KText = ""  
        'Überprüfen ob CodeText leer ist, wenn ja, Fehler melden,  
        ' Fokus auf CodeText und Sub abbrechen  
        If CodeText.Text <> "" Then  
            CText = CodeText.Text
        Else
            MsgBox("Bitte Codetext eingeben.")  
            CodeText.Focus()
            Exit Sub
        End If
        'Überprüfen ob Schlüssel leer ist, wenn ja, Fehler melden,  
        ' Fokus auf Schlüssel und Sub abbrechen  
        If Schlüssel.Text <> "" Then  
            Key = Schlüssel.Text
        Else
            MsgBox("Bitte Schlüssel eingeben.")  
            Schlüssel.Focus()
            Exit Sub
        End If
        'Text mit Coder(-Funktionen) entschlüsseln  
        KlarText.Text = Coder.Decrypt(CText, Key)
        'Bei Fehler Ausgaben löschen  
        If Fehler Then
            Fehler = False
            KlarText.Text = "Fehler aufgetreten"  
        End If
    End Sub

    'Variable die Anzeigt, ob Fehler aufgetreten ist  
    Dim Fehler As Boolean
    Private Sub Coder_Fehler(ByVal ex As System.Exception, ByVal Location As String) Handles Coder.Fehler
        MsgBox("Fehler in Sub/Function " & Location & " :" & vbNewLine & "Fehler: " & vbNewLine & ex.Message)  
        Fehler = True
    End Sub
End Class

"NutzCode":
''' <summary>  
''' Stellt Funktionen zum Ver- und Entschlüsseln von Texten in Stringformat bereit  
''' </summary>  
''' <remarks></remarks>  
Public Class Coder
    Public Sub New()
    End Sub
    Public Sub New(ByVal Alphabet_ As String)
        _Alphabet = Alphabet_
    End Sub

    'Error Event  
    Public Event Fehler(ByVal ex As Exception, ByVal Location As String)

    'Variable für Schlüssel  
    Dim _Key As String
    Public ReadOnly Property Key() As String
        Get
            Return _Key
        End Get
    End Property

    'Benutztes Alphabet; Zeichensatz  
    Private _Alphabet As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz.,-_!?()^'äöü0123456789"  
    Public Property Alphabet() As String
        Get
            Return _Alphabet
        End Get
        Set(ByVal value As String)
            _Alphabet = value
        End Set
    End Property

    Private Function AlphabeteErzeugen(ByVal Paare(,) As Byte) As String()
        Try
            'Variable für die Alphabete  
            Dim Alphabete(Paare.Length / 2 - 1) As String

            'Schleife für alle Alphabete ablaufen  
            For i As Byte = 0 To Paare.Length / 2 - 1
                'Endscheiden ob das zum aktuellen Alphabet gehörende  
                'a kleiner oder grösser als das b ist, und entsprechende Begrenzungen festlegen  
                If Paare(i, 0) < Paare(i, 1) Then
                    Alphabete(i) = AKleinerB(Paare(i, 0), Paare(i, 1))
                Else
                    Alphabete(i) = AGrösserB(Paare(i, 0), Paare(i, 1))
                End If
            Next
            Return Alphabete
        Catch ex As Exception
            RaiseEvent Fehler(ex, "AlphabeteErzeugen")  
            Return Nothing
        End Try
    End Function

    'Begrenzungsfunkitonen, die die entsprechenden Begrenzungen in das Array Begrenzungen schreiben  
    'und die Alphabetgenerierung starten, und deren generierte Alphabete zurückgeben  
    'Was die Begrenzungen bedeuten, wird unten erklärt  
    Private Function AKleinerB(ByVal a As Byte, ByVal b As Byte)
        Try
            'Array für die Begrenzungen und Schritte der Code-Alphabete  
            Dim Begrenzungen(2, 2) As SByte
            Begrenzungen(0, 0) = b
            Begrenzungen(0, 1) = -1
            Begrenzungen(0, 2) = a + 1
            Begrenzungen(1, 0) = 1
            Begrenzungen(1, 1) = 1
            Begrenzungen(1, 2) = a
            Begrenzungen(2, 0) = _Alphabet.Length
            Begrenzungen(2, 1) = -1
            Begrenzungen(2, 2) = b + 1
            'Generiertes Alphabet zurückgeben  
            Return AlphabetReihenfolge(Begrenzungen)
        Catch ex As Exception
            RaiseEvent Fehler(ex, "AKleinerB")  
            Return Nothing
        End Try
    End Function
    Private Function AGrösserB(ByVal a As Byte, ByVal b As Byte)
        Try
            'Array für die Begrenzungen und Schritte der Code-Alphabete  
            Dim Begrenzungen(2, 2) As SByte
            Begrenzungen(0, 0) = a + 1
            Begrenzungen(0, 1) = 1
            Begrenzungen(0, 2) = _Alphabet.Length
            Begrenzungen(1, 0) = b
            Begrenzungen(1, 1) = -1
            Begrenzungen(1, 2) = 1
            Begrenzungen(2, 0) = b + 1
            Begrenzungen(2, 1) = 1
            Begrenzungen(2, 2) = a - 1
            'Generiertes Alphabet zurückgeben  
            Return AlphabetReihenfolge(Begrenzungen)
        Catch ex As Exception
            RaiseEvent Fehler(ex, "AGrösserB")  
            Return Nothing
        End Try
    End Function
    'Funktion, die die Zeichen aus Alphabet in der richtigen Reihenfolgen in das Code-Alphabet einfügt  
    Private Function AlphabetReihenfolge(ByVal Begrenzungen(,) As SByte) As String
        Try
            'Variable für das Alphabet  
            Dim Alphabet As String = ""  

            'Variable, die anzeigt in welchem der drei Abschnitte eines Alphabets man sich befindet  
            Dim Abschnitt As Byte = 0 'Startwert: Am Anfang ist man immer im ersten Abschnitt  

            'Variable, die anzeigt, das wievielte Zeichen gerade bearbeitet wird  
            Dim Zeichen As Byte = Begrenzungen(0, 0) 'Startwert: Das Zeichen, mit dem man beginnt  

            'Variable, die bestimmt ob die Zeichen aus Alphabet in auf- oder absteigender   
            'Reihenfolge behandelt werden  
            Dim Schritt As SByte = Begrenzungen(0, 1) 'Startwert: Wert aus Begrenzungen  

            'Die nachfolgenden Schritte werden soviel mal ausgeführt, wie Alphabet lang ist  
            For i As Byte = 0 To _Alphabet.Length - 1

                'Das Zeichen an der Stelle Zeichen-1 aus dem "alten" Alphabet wird an das zu   
                'bearbeitende Alphabet angefügt  
                Alphabet &= _Alphabet.ElementAt(Zeichen - 1)

                ' Prüfen, ob das gerade bearbeitete Zeichen das letzte eines Abschnitts ist  
                If Zeichen = Begrenzungen(Abschnitt, 2) Then

                    'Wenn der alte Abschnitt der letzte war, dann zu nächstem i springen  
                    'Gleichbedeutend mit Exit for (nur in diesem Fall!)  
                    If Abschnitt = 2 Then Continue For

                    '(Sonst) Abschnitt um 1 erhöhen  
                    Abschnitt += 1

                    'Nächstes zu bearbeitende Zeichen mithilfe des Array Begrenzungen laden  
                    Zeichen = Begrenzungen(Abschnitt, 0)
                    'Gleiches für Schritte  
                    Schritt = Begrenzungen(Abschnitt, 1)
                Else
                    'Wenn kein neuer abschnitt beginnt, nächstes Zeichen entsprechend Schritt nehmen  
                    Zeichen += Schritt
                End If
            Next
            Return Alphabet
        Catch ex As Exception
            RaiseEvent Fehler(ex, "AlphabetReihenfolge")  
            Return Nothing
        End Try
    End Function

    'Verschlüsselungsfunktion  
    Public Function Encrypt(ByVal KText As String)
        Try
            Dim CText As String = ""  

            'Zufälligen Schlüssel errechnen und Alphabete erzeugen und die Alphabete speichern  
            Dim Alphabete() As String = AlphabeteErzeugen(SchlüsselErzeugen(KText.Length))

            'Variable, die zeigt, welches Alphabet zur Verschlüsselung des nächsten Zeichen   
            'verwendet wird  
            Dim AlphabetNr As Byte = 0 'Startwert: Es wird immer mit dem ersten Alphabet begonnen  

            'Zu verschlüsselndes Zeichen  
            Dim ToCodeChar As Char

            'Schleife für jedes Zeichen in KText abarbeiten  
            For i As Integer = 0 To KText.Length - 1

                'Zu Codierendes Zeichen festlegen  
                ToCodeChar = KText.ElementAt(i)

                'Fehler wenn Zeichen nicht in Alphabet abfangen  
                If Not _Alphabet.Contains(ToCodeChar) Then
                    RaiseEvent Fehler(New Exception("Zeichen nicht in Alphabet enthalten"), "Encrypt")  
                    Return Nothing
                End If

                'Codiertes Zeichen an CText anfügen  
                CText &= Alphabete(AlphabetNr).ElementAt(_Alphabet.IndexOf(ToCodeChar))

                'Wenn das gerade verwendete Code-Alphabet nicht das letzte war, dann nächstes nehmen  
                'Entspricht einer ModuloFunktion:  
                AlphabetNr = (AlphabetNr + 1) Mod Alphabete.Count()
            Next

            'Ergebnis zurückgeben  
            Return CText
        Catch ex As Exception
            RaiseEvent Fehler(ex, "Encrypt")  
            Return Nothing
        End Try
    End Function
    'Funktion die einen Schlüssel mit maximallänge berrechnet und die errechneten Paare zurückgibt  
    Private Function SchlüsselErzeugen(ByVal MaxLength As Integer) As Byte(,)
        Try
            'Array für die Paare  
            Dim Paare(8, 1) As Byte

            'Grösster Wert der als Zahl für ein Paar genommen werden kann  
            Dim Max As Byte = _Alphabet.Length

            'Die beiden Zahlen eines Paars  
            Dim a As Byte
            Dim b As Byte

            'Anzahl der Paare: KTextlänge -1 aber kleiner als 10   
            Dim AnzahlPaare As Byte = MaxLength
            If AnzahlPaare > 9 Then AnzahlPaare = 9

            'Kette aller Zahlen, die für jedes Paare eine eindeutige (für jedes mögliche Paar   
            'eine andere) aus a und b berechnet werden  
            Dim Kombinationen As String = ""  

            'Kette aller Zeichenanzahlen der Kombinationen  
            Dim KombinationenZeichen As String = ""  

            'Zufallsgenerator Initialisieren  
            Randomize()

            'Die Paare erzeugen  
            For i As Byte = 0 To AnzahlPaare - 1

                'Erste Zahl des Paars; zwischen 2 und max  
                a = CByte(Int(2 + (Max - 2) * Rnd()))

                'Zweite Zahl; Wenn gleich erste, dann neue Zahl nehmen  
                Do
                    b = CByte(Int(2 + (Max - 2) * Rnd()))
                Loop Until a <> b

                'a und b in Paare schreiben:  
                Paare(i, 0) = a
                Paare(i, 1) = b

                'Kombinationszahl aus a und b berechnen und an Kombinationen anfügen  
                'Zur Erklärung siehe ganz am Ende des Codes  
                Kombinationen = Kombinationen & (a - 1) * Max + b
                'Anzahl Zeichen der neuen Kombination an KombinationenZeichen  
                KombinationenZeichen &= Str((a - 1) * Max + b).Length - 1
            Next

            'Kombinationen und KombinationenZeichen zusammenfügen  
            _Key = Kombinationen & KombinationenZeichen
            'Letzte Zeichenkettenlänge abschneiden und AnzahlPaare anfügen  
            _Key = Microsoft.VisualBasic.Left(_Key, _Key.Length - 1) & AnzahlPaare
            Return Paare
        Catch ex As Exception
            RaiseEvent Fehler(ex, "SchlüsselErzeugen")  
            Return Nothing
        End Try
    End Function

    'Enschlüsselungsfunktion  
    Public Function Decrypt(ByVal CText As String, ByVal Key_ As String) As String
        Try
            'Schlüssel in Schlüsselvariable speichern  
            _Key = Key_

            Dim KText As String = ""  

            'Paare ausrechnen und Alphabete erzeugen und Alphabete in Variable speichern  
            Dim Alphabete As String() = AlphabeteErzeugen(ErrechnePaare())

            'Variable, die zeigt, welches Alphabet zur Verschlüsselung des nächsten Zeichen   
            'verwendet wird  

            Dim AlphabetNr As Byte = 0 'Startwert: Es wird immer mit dem ersten Alphabet begonnen  

            'Zu verschlüsselndes Zeichen  
            Dim ToDecodeChar As Char

            'Schleife für jedes Zeichen in KText abarbeiten  
            For i As Integer = 0 To CText.Length - 1
                'Zu Codierendes Zeichen festlegen  
                ToDecodeChar = CText.ElementAt(i)
                'Codiertes Zeichen an CText anfügen  
                KText &= _Alphabet.ElementAt(Alphabete(AlphabetNr).IndexOf(ToDecodeChar))
                'Wenn das gerade verwendete Code-Alphabet nicht das letzte war, dann nächstes nehmen  
                'Entspricht einer ModuloFunktion:  
                AlphabetNr = (AlphabetNr + 1) Mod Alphabete.Count
            Next

            'Ergebnis zurückgeben  
            Return KText
        Catch ex As Exception
            RaiseEvent Fehler(ex, "Decrypt")  
            Return Nothing
        End Try
    End Function
    'Funktion die aus dem Schlüssel die Paare zurückgewinnt  
    Private Function ErrechnePaare() As Byte(,)
        Try
            'Variable für die Anzahl der Alphabete  
            Dim AnzahlAlphabete As Byte = CByte(CStr(_Key.Last))

            'Variable, die am Schluss zurückgegeben wird  
            Dim Paare(AnzahlAlphabete - 1, 1) As Byte

            'In dieser Variable steht der Teil des Schlüssels, der die Zeichenanzahlen der  
            'Paarkombinationen enthält. Dabei steht in AnzahlAlphabete das letzte Zeichen   
            'des Schlüssels. Dies sagt wieviele Paare man braucht. Da im Schlüssel die Zeichen-  
            'zahl des letzten fehlt, kann man die Zahl ohne Umrechnug nehmen  
            Dim PaareZeichen As String = Microsoft.VisualBasic.Right(_Key, AnzahlAlphabete)

            'Das letzte Zeichen, das das die Paaranzahl enthält, wird Abgeschnitten  
            PaareZeichen = Microsoft.VisualBasic.Left(PaareZeichen, AnzahlAlphabete - 1)

            'Diese Variable enthält den Teil des Schlüssels, der die zusammengefügten Paarkomb-  
            'binationen enthält. Das ist alles bis auf den Teil, der in PaareZeichen steht  
            Dim Bearbeit_Key As String = Microsoft.VisualBasic.Left(_Key, _Key.Length - AnzahlAlphabete)

            'Hier wird die Kombinationszahl des gerade bearbeitenden Paares gespeichert  
            Dim PaarKombiniert As Integer

            'Schleife wird für jedes Paar abgearbeitet  
            For i As Byte = 0 To AnzahlAlphabete - 1

                'Wenn nicht das letzte Paar bearbeitet wird...  
                If i < AnzahlAlphabete - 1 Then
                    '...dann die entsprechende Anzahl Zeichen (steht in PaareZeichen an i-ter stelle)  
                    ' von Bearbeit_Key abschneiden und in PaarKombiniert schreiben.  
                    PaarKombiniert = Microsoft.VisualBasic.Left( _
                        Bearbeit_Key, Microsoft.VisualBasic.Val(PaareZeichen.ElementAt(i)))

                    'Der Teil der in PaarKombiniert steht, von Bearbeit_Key abschneiden  
                    Bearbeit_Key = Microsoft.VisualBasic.Right(Bearbeit_Key, _
                                Bearbeit_Key.Length - CStr(PaarKombiniert).Length)
                Else
                    '...Sonst den Bearbeit_Key in PaarKombiniert laden, da die Zeichenanzahl nicht in  
                    'PaareZeichen steht (wurde bei der SChlüsselerzeugung abgeschnitten). Der Rest  
                    'ist aber sowieso das was man noch braucht  
                    PaarKombiniert = Bearbeit_Key
                End If

                'Erklärung zur Berechnung siehe ganz am Ende des Codes  
                Paare(i, 0) = Int(PaarKombiniert / (_Alphabet.Length)) + 1
                Paare(i, 1) = PaarKombiniert - (_Alphabet.Length) * (Paare(i, 0) - 1)
            Next
            Return Paare
        Catch ex As Exception
            RaiseEvent Fehler(ex, "ErrechnePaare")  
            Return Nothing
        End Try
    End Function
End Class

'Erklärung zum Aufbau der Alphabete  
'der Einfachheit halber wird hier das Grundalphabet "ABCDEFGHIJ" benutzt  
'  
'Jedes aus dem Grundalphabet generierte Alphabet lässt sich mit zwei Zahlen (a und b) definieren:  
'Wenn a kleiner b, dann sieht der Aufbau so aus:  
'z.B.: (a=4,b=8)  
'A B C D|E F G H|I J  
'       a       b  
'------>|<------|<--  
'   2.      1.    3.  
'-->Das Alphabet wir din 3 Teile geteilt (an den Stellen nach dem a-ten und b-ten Zeichen)  
'Diese Stücke werden dann in der oben genannten Richtung und Reihenfolge abgearbeitet:  
'H G F E|A B C D|J I  
'   1.      2.    3.  

'Ähnliches für a grösser b:  
'z.B.: (a=7,b=3)  
'A B C|D E F G|H I J  
'     b       a  
'<----|------>|---->  
'  2.     3.     1.  
'-->  
'H I J|C B A|D E F G  
'  1.    2.     3.  
'  
'  
'Erklärung zum Begrenzungsarry:  
'Hier drin werden die Begrenzungen der 3 Teilstücke abgespeichert, und zwar nach folgendem Schema:  
'Beg(x,0):Start des x-ten Teils  
'Beg(x,1):Richtung des x-ten Teils (-1,+1)  
'Beg(x,2):Ende des x-ten Teils  
'  
'  
'Erklärung zur Berechnug Paarkombination aus Paar und Umgekehrt:  
'  
'Man sollte sich eine quadratische Tabelle mit der Anzahl Reihen und Spalten vorstellen,  
'wie das benutzte Alphabet Buchstaben hat. Der Einfachheit halber wird hier eine 10x10 Tabelle  
'benutzt.  
'Bsp: (a und b sind nacher die Zahlen aus denen das Paar besteht)  
'  
' 1  2  3  4  5  6  7  8  9  10  
' 11 12 13 14 15 16 17 18 19 20   
' 21 22 23 24 25 26 27 28 29 30  
' 31 32 33 34 35 36 37 38 39 40  
' 41 42 43 44 45 46 47 48 49 50  
' 51 52 53 54 55 56 57 58 59 60  
' 61 62 63 64 65 66 67 68 69 70  
' 71 72 73 74 75 76 77 78 79 80  
' 81 82 83 84 85 86 87 88 89 90  
' 91 92 93 94 95 96 97 98 99 100  

'Die Felder werden von links nach rechts und von oben nach unten durchnummeriert.  
'Wenn man sich a als Spalten- und b als Zeilenindex vorstellt, die beide in einem Bereich  
'zwischen 1 und 5 (grösse der Tabelle) liegen, so sieht man, dass die Zehnerstelle dem a und  
'die Einerstelle dem b entspricht. Die Zehnerstelle lässt sich also so berechnen: a-1  
'Die Einerstelle ist einfach b. Zusammen hiesse das: Zehnerstelle*10 + Einerstelle.  
'Setzt man nun ein, so entsteht (a-1)*10+b. Das *10 lässt sich durch *Alphabetlänge ersetzen.  
'Dann hat man die im Code verwendete Formel ((a-1)*Alphabet.Length-1)+b. Das -1 kommt vom  
'Index, der bei 0 oder 1 beginnt.  
'  
'Die Umkehrung sollte sich nach etwas Überlegen selbst erklären. Die Formeln sind, um sie nicht  
'suchen zu müssen, hier nochmal hingeschrieben:  
'a = Int(Paar / Alphabet.Length  
'b = Paar - (a - 1) * Alphabet.Length  
'Abgeändert auf das 10*10 Feld:  
'a = Int((Paar - 1) / 10 ; Das - 1 nach Paar kommt davon, dass b im Beispiel 10 (Breite  
'der Tabelle) sein kann, im Code jedoch nicht.  
'b = Paar - (a-1) * 10  

Das hier ist noch der Code der Sub "NEW": (Mit Variabledeklaration)
   Private Sub New()
        Me.KlarText = New System.Windows.Forms.TextBox()
        Me.CodeText = New System.Windows.Forms.TextBox()
        Me.Entschlüsseln = New System.Windows.Forms.Button()
        Me.Verschlüsseln = New System.Windows.Forms.Button()
        Me.Schlüssel = New System.Windows.Forms.TextBox()
        Me.Label1 = New System.Windows.Forms.Label()
        Me.Label2 = New System.Windows.Forms.Label()
        Me.Label3 = New System.Windows.Forms.Label()
        Me.SuspendLayout()
        '  
        'KlarText  
        '  
        Me.KlarText.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!)  
        Me.KlarText.Location = New System.Drawing.Point(57, 13)
        Me.KlarText.Name = "KlarText"  
        Me.KlarText.Size = New System.Drawing.Size(380, 20)
        Me.KlarText.TabIndex = 0
        '  
        'CodeText  
        '  
        Me.CodeText.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!)  
        Me.CodeText.Location = New System.Drawing.Point(57, 40)
        Me.CodeText.Name = "CodeText"  
        Me.CodeText.Size = New System.Drawing.Size(380, 20)
        Me.CodeText.TabIndex = 1
        '  
        'Entschlüsseln  
        '  
        Me.Entschlüsseln.Location = New System.Drawing.Point(227, 93)
        Me.Entschlüsseln.Name = "Entschlüsseln"  
        Me.Entschlüsseln.Size = New System.Drawing.Size(210, 23)
        Me.Entschlüsseln.TabIndex = 2
        Me.Entschlüsseln.Text = "Entschlüsseln"  
        Me.Entschlüsseln.UseVisualStyleBackColor = True
        '  
        'Verschlüsseln  
        '  
        Me.Verschlüsseln.Location = New System.Drawing.Point(16, 93)
        Me.Verschlüsseln.Name = "Verschlüsseln"  
        Me.Verschlüsseln.Size = New System.Drawing.Size(209, 23)
        Me.Verschlüsseln.TabIndex = 3
        Me.Verschlüsseln.Text = "Verschlüsseln"  
        Me.Verschlüsseln.UseVisualStyleBackColor = True
        '  
        'Schlüssel  
        '  
        Me.Schlüssel.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!)  
        Me.Schlüssel.Location = New System.Drawing.Point(74, 67)
        Me.Schlüssel.Name = "Schlüssel"  
        Me.Schlüssel.Size = New System.Drawing.Size(363, 20)
        Me.Schlüssel.TabIndex = 4
        '  
        'Label1  
        '  
        Me.Label1.AutoSize = True
        Me.Label1.Location = New System.Drawing.Point(13, 19)
        Me.Label1.Name = "Label1"  
        Me.Label1.Size = New System.Drawing.Size(38, 13)
        Me.Label1.TabIndex = 5
        Me.Label1.Text = "KText:"  
        '  
        'Label2  
        '  
        Me.Label2.AutoSize = True
        Me.Label2.Location = New System.Drawing.Point(13, 43)
        Me.Label2.Name = "Label2"  
        Me.Label2.Size = New System.Drawing.Size(38, 13)
        Me.Label2.TabIndex = 6
        Me.Label2.Text = "CText:"  
        '  
        'Label3  
        '  
        Me.Label3.AutoSize = True
        Me.Label3.Location = New System.Drawing.Point(13, 70)
        Me.Label3.Name = "Label3"  
        Me.Label3.Size = New System.Drawing.Size(55, 13)
        Me.Label3.TabIndex = 7
        Me.Label3.Text = "Schlüssel:"  
        '  
        'Form1  
        '  
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(449, 128)
        Me.Controls.Add(Me.Label3)
        Me.Controls.Add(Me.Label2)
        Me.Controls.Add(Me.Label1)
        Me.Controls.Add(Me.Schlüssel)
        Me.Controls.Add(Me.Verschlüsseln)
        Me.Controls.Add(Me.Entschlüsseln)
        Me.Controls.Add(Me.CodeText)
        Me.Controls.Add(Me.KlarText)
        Me.Name = "Form1"  
        Me.Text = "Codierung"  
        Me.ResumeLayout(False)
        Me.PerformLayout()

    End Sub
    Friend WithEvents KlarText As System.Windows.Forms.TextBox
    Friend WithEvents CodeText As System.Windows.Forms.TextBox
    Friend WithEvents Entschlüsseln As System.Windows.Forms.Button
    Friend WithEvents Verschlüsseln As System.Windows.Forms.Button
    Friend WithEvents Schlüssel As System.Windows.Forms.TextBox
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents Label2 As System.Windows.Forms.Label
    Friend WithEvents Label3 As System.Windows.Forms.Label

[EDIT: Der Code sollte ausreichend kommentiert sein, Erklärungen zum System sind unten im NutzCode, wenn zu weng, bitte nachfragen]

Ich hoffe es ist verständlich und hat keine Fehler!-Wenn doch, schreibt bitte einen Kommentar

Der Code ist hauptsächlich zu Übungszwecken im Umgang mit VB.NET gedacht. (ICh hab auch keine Ahnung, wie sicher die Verschlüsselung ist face-wink)

Wenn ihr Verbesserungsvorschläge habt, bitte postet sie face-smile

Mathe172

Content-ID: 157216

Url: https://administrator.de/tutorial/selbsterfundener-codier-oder-verschluesselungdsalgorythmus-mit-erklaerung-vb-net-157216.html

Ausgedruckt am: 22.12.2024 um 01:12 Uhr

SlainteMhath
SlainteMhath 20.12.2010 um 17:12:29 Uhr
Goto Top
Moin,

Der Code ist hauptsächlich zu Übungszwecken im Umgang mit VB.NET gedacht.
Also der Code mag zwar funktionieren, aber schön ist er nicht.

Ich hoffe es ist verständlich [...]

Nein ist er nicht, weil:
- Du benutzt nur Subs, Variablen sind global definiert und werden nicht explizit übergeben bzw zurück gegeben.
- Form und "Nutzcode" sind kaum trennbar. Der Code der die Arbeit macht solle in ein eigenes Modul, besser noch in einen eigene Klasse,
- Fehlerbehandlung (Try...catch) fehlt völlig.

Dadruch ist der Code sehr schwer zu lesen.

ICh hab auch keine Ahnung, wie sicher die Verschlüsselung ist
Ich auch nicht face-smile

schreibt bitte einen Kommentar
Ist hiermit geschehen face-smile

lg
Slainte
mathe172
mathe172 22.12.2010 um 14:10:06 Uhr
Goto Top
@SlainteMhath:
Du benutzt nur Subs, Variablen sind global definiert und werden nicht explizit übergeben bzw zurück gegeben.

Wie meinst du das genau? Soll ich alles mit Byref und Byval machen?

Form und "Nutzcode" sind kaum trennbar. Der Code der die Arbeit macht solle in ein eigenes Modul, besser noch in einen eigene Klasse,

Werde ich nachholen face-wink

Fehlerbehandlung (Try...catch) fehlt völlig.

Mache ich danach... Leider hab ich damit noch nicht soviel erfahrung, aber ich werds versuchen face-smile

Mathe172
laster
laster 23.12.2010 um 15:50:29 Uhr
Goto Top
Hallo,
bei 421 Zeilen Code (inkl. Kommentare) sollte man schon mal in einigen Sätzen beschreiben, wie das System funktioniert. Dann könnte ich entscheiden, ob ich den Code nutze oder nicht...

ein schönes Weihnachtsfest

LS
mathe172
mathe172 23.12.2010 um 17:13:23 Uhr
Goto Top
@laster:
Meiner Meinung nach ist das System im Code selbst ziehmlich ausfühlich erklärt...
Aber wie SlainteMhath gesagt hat (zurecht) ist der code noch nicht wirklich lesbar. Ich hoffe ich finde demnächst die Zeit, das auszubessern.

Mathe172
mathe172
mathe172 23.12.2010 um 21:56:45 Uhr
Goto Top
So jetzt sollte der Code besser sein.
  • Ich habe eine kleine Fehlerbehandlungsroutine eingebaut (ich weiss sie ist WINZIG face-wink, aber ich habe ehrlich gesagt keine wirkliche Ahnung davon ***schäm***)
  • Ich habe den "Nutzcode" in eine eigene Klasse getan
  • Ich habe das System ein bisschen besser erklärt
  • Nur noch eine globale Variable im Nutzcode (Key as String), habe aber keine Ahnung wie ich die ohne viel aufwand wegkriege
  • Ich habe noch ein paar kleinere Verschönerungen gemacht

Schöne Weihnachten,

Mathe172
P.S.:@SlainteMhath: Ich hoffe es gefällt dir jetzt besser face-smile
cosphi
cosphi 26.12.2010 um 17:29:49 Uhr
Goto Top
Der Code ist hauptsächlich zu Übungszwecken im Umgang mit VB.NET gedacht. (ICh hab auch keine Ahnung, wie sicher die
Verschlüsselung ist face-wink)

Wenn es sicher sein soll, würde ich mich auf sowas niemals verlassen. Zugegeben, ích hab mir deinen Algorithmus nicht genauer angesehen aber ich gehe zu 100% davon aus dass er unsicher ist.
mathe172
mathe172 26.12.2010 um 17:36:08 Uhr
Goto Top
Hallo cosphi!

aber ich gehe zu 100% davon aus dass er unsicher ist.
Könntest du mir vielleicht sagen wieso? Vielleicht kann ich ihn ja ändern.

Mathe172
darnitiger
darnitiger 27.12.2010 um 17:17:26 Uhr
Goto Top
sieht recht wirr aus... jedoch sage ich immer was funktioniert kann SO FALSCH auch nicht sein ;)
lowbyte1
lowbyte1 25.01.2011 um 20:16:13 Uhr
Goto Top
1. Der Algorithmus ist zu 100% unsicher! (Denn so wie du ja geschrieben hast weist du nicht ob er sicher ist oder nicht).
2. Sollte mann eine Menge verstehen von Kryptographie, Mathematik ,Protokollen etc... (und dass ist hier leider nicht der Fall).
3. Sollte mann für die Implementierung eine geeignete Programmiersprache wählen. Denn mit vb.net (sterbens langsam).
4. Ensteht so ein Algorithmus zuerst auf dem Papier. Danach wird zbsp. in (meistens) C implementiert, und optimiert... und danach kommt immer ein Paper!
5. Wenn du Programmieren lernen willst such dir eine anderes Gebiet, als Crypto-Progrämmchen zu schreiben die sowiso nichts Wert sind, sorry!
6. Wenn du dich aber intressierts für Algorithmen, Crypto ,Verfahren etc. Dann empfehle ich dir ein Buch zu kaufen. zbsp.

Angewandte Kryptographie - Der Klassiker. Protokolle, Algorithmen und Sourcecode in C.
http://www.amazon.de/Angewandte-Kryptographie-Klassiker-Protokolle-Algo ...

oder Dich mal im Netz umschauen... denn es gibt genug sources.
oder schau mal hier. Eine Seite von mir im Aufbau... dort findest du den blockverschlüsselungs Algorithmus SPC23. Kannst ja mal reinschauen.

XOR - BASE
http://vpn23.homelinux.org