none
Den Buchstaben "A" verschlüsseln

    Frage

  • Hallo zusammen! Ich bin neu hier und auch gleichzeitig neu beim Programmieren. Ich habe hier ein kleines Problem, ich muss dieses Programm für mein Informatikunterrich programmieren und komme leider nicht weiter :(

    wie ihr anhand dieser Grafiken sehen könnt, will ich den Buchstaben "A" verschlüsseln.

    Doch wenn ich jetzt auf "verschlüsseln" klicke, wird ein "G" angezeigt. Eigentlich sollte ein "D" ausgegeben werden, wie ihr unten in dem Codeblock sehen könnt.

    Die Ursache dafür kenne ich, da das Programm das ausgegebene "D" auch nochmal in ein "X" und das wiederrum in ein "G" umwandelt. Nur leider weiß ich nicht, wie ich es ändern soll damit jeder Buchstabe nur einmal umgeändert wird.                                                            
    Ich hoffe, dass ihr mein Anliegen versteht und das ihr mir helfen könnt!

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If TextBox1.Text = "" Then Else Me.Text = "wird verschlüsselt...Bitte warten. Dieser Vorgang kann je nach Textlänge etwas dauern." Me.Enabled = False TextBox1.ReadOnly = True Button4.Enabled = True Button5.Enabled = True Dim i As Integer Dim strString As String Dim strNew As String strString = TextBox1.Text TextBox1.Text = TextBox1.Text.Replace("?", "?") TextBox1.Text = TextBox1.Text.Replace("\", "\") TextBox1.Text = TextBox1.Text.Replace("!", "!") TextBox1.Text = TextBox1.Text.Replace(":", ":") TextBox1.Text = TextBox1.Text.Replace("|", "|") TextBox1.Text = TextBox1.Text.Replace("_", "_") TextBox1.Text = TextBox1.Text.Replace("{", "{") TextBox1.Text = TextBox1.Text.Replace("}", "}") TextBox1.Text = TextBox1.Text.Replace("%", "%") TextBox1.Text = TextBox1.Text.Replace("$", "$") TextBox1.Text = TextBox1.Text.Replace(".", ".") TextBox1.Text = TextBox1.Text.Replace(",", ",") TextBox1.Text = TextBox1.Text.Replace(";", ";") TextBox1.Text = TextBox1.Text.Replace("+", "+") TextBox1.Text = TextBox1.Text.Replace("A", "D") TextBox1.Text = TextBox1.Text.Replace("B", "E") TextBox1.Text = TextBox1.Text.Replace("C", "M") TextBox1.Text = TextBox1.Text.Replace("D", "X") TextBox1.Text = TextBox1.Text.Replace("E", "V") TextBox1.Text = TextBox1.Text.Replace("F", "S") TextBox1.Text = TextBox1.Text.Replace("G", "U") TextBox1.Text = TextBox1.Text.Replace("H", "N") TextBox1.Text = TextBox1.Text.Replace("I", "Z") TextBox1.Text = TextBox1.Text.Replace("J", "I") TextBox1.Text = TextBox1.Text.Replace("K", "J") TextBox1.Text = TextBox1.Text.Replace("L", "K") TextBox1.Text = TextBox1.Text.Replace("M", "A") TextBox1.Text = TextBox1.Text.Replace("N", "C") TextBox1.Text = TextBox1.Text.Replace("O", "B") TextBox1.Text = TextBox1.Text.Replace("P", "Q") TextBox1.Text = TextBox1.Text.Replace("Q", "O") TextBox1.Text = TextBox1.Text.Replace("R", "H") TextBox1.Text = TextBox1.Text.Replace("S", "F") TextBox1.Text = TextBox1.Text.Replace("T", "R") TextBox1.Text = TextBox1.Text.Replace("U", "P") TextBox1.Text = TextBox1.Text.Replace("V", "T") TextBox1.Text = TextBox1.Text.Replace("W", "L") TextBox1.Text = TextBox1.Text.Replace("X", "G") TextBox1.Text = TextBox1.Text.Replace("Y", "W") TextBox1.Text = TextBox1.Text.Replace("Z", "Y") Me.Text = "Geheimschrift by Felix" Me.Enabled = True End If End Sub


    Donnerstag, 22. November 2012 16:05

Alle Antworten

  • Hallo, das ist eigentlich ganz einfach. Der Text einer Textbox ist ein String. In diesem ersetzt du per Replace das A durch ein D weiter unten, werden dann alle D's durch ein X und noch weiter unten alle X durch G ersetzt.

    Das Problem dabei ist, das du die Alle Positionen merken musst und erst zum schluss alle ersetzen:

    Dim mc_A As MatchCollection = Regex.Matches(s, "[A]")
    Dim mc_B As MatchCollection = Regex.Matches(s, "[B]")
    '...
    For Each m As Match In mc_A
    	s = s.Remove(m.Index, 1)
    	'Zeichen entfernen
    	'Neues Zeichen einfügen
    	s = s.Insert(m.Index, "D")
    Next
    For Each m As Match In mc_B
    	s = s.Remove(m.Index, 1)
    	'Zeichen entfernen
    	'Neues Zeichen einfügen
    	s = s.Insert(m.Index, "E")
    Next
    '...
    
    Ich habe es in diesem Fall über Regex gelöst, welches Aller Vorkommen von A, B usw. sucht und anschließend ersetzt.

    Eine andere Möglichkeit fällt mir da jetzt auch nicht ein.

    Eine Alternative, aber schwieriger Umzusetzen, wäre alle Zeichen des Strings durch zu gehen und dann entsprechend zu ersetzen. Das müsste auch weniger Rechenzeit brauchen, da Regex relativ viel benötigt:

    Dim sb As New StringBuilder()
    Dim cs As Char() = s.ToCharArray()
    For i As Integer = 0 To cs.Length - 1
    	Select Case cs(i)
    		Case "A"C
    			sb.Append("D")
    			Exit Select
    		Case "B"C
    			sb.Append("E")
    			Exit Select
    		Case Else
    			sb.Append(cs(i))
    			Exit Select
    	End Select
    Next
    s = sb.ToString()
    
    Ich weiß ja nicht was Ihr schon alles behandelt habt, aber über Replace funktioniert es nicht. Regex ist eine Komplexe, einfach aussehende, in diesem Fall auch einfache, Methode um das durchzuführen. Einfacher ist natürlich der Code mit dem durchgehen der Zeichen.


    Koopakiller [kuːpakɪllɐ] - http://koopakiller.ko.ohost.de/

    Freitag, 23. November 2012 11:33
    Moderator
  • Hi Felix,

    ich würde es in einer Schleife machen und jeden Buchstaben einzeln zum ersetzen an eine Extra Funtion senden.

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim OriginalText As String = "Hier steht dein zu ersetzender Text drin."
            For i As Long = 1 To OriginalText.Length
                Mid(OriginalText, i, 1) = ErsetzeZeichen(Mid(OriginalText, i, 1).ToUpper)
            Next
            MsgBox(OriginalText)
        End Sub
        Private Function ErsetzeZeichen(Zeichen As Char) As Char
            Select Case Zeichen
                Case "A"
                    Return "D"
                Case "B"
                    Return "E"
                Case "C"
                    Return "M"
                Case "D"
                    Return "X"
            End Select
        End Function
    Gruß George
    Freitag, 23. November 2012 11:45
  • Hi Felix.

    Du kannst es auch wie folgt lösen:

    Public QuellAlphabet as String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    Public ZielAlphabet as String = "ZYXWVUTSRQPONMLKJIHGFEDCBA"

    'Hier kannst du natürlich ein beliebiges Alphabet nehmen und alles durcheinander würfeln!

    'Wichtig: Beide Alphabete haben gleich viele Zeichen und jedes darf nur 1 Mal vorkommen!

    'Und: Es sollten im Quell- und Zielalphabet die selben Zeichen vorkommen, sonst gibt es beim

    '        Entschlüsseln Probleme! Denke an die Definition einer "umkehrbaren Funktion" und

    '        ihrer Funktionswerte(-paare).

    Public Function Verschlüsseln(Eingabe as String) as String

    Dim Ergebnis as String=""

    For I As Integer = 1 To Eingabe.Length

    'Diese Zeile musst du ein wenig anpassen, wenn du entschlüsseln willst:

    If Instr(QuellAlphabet, Mid(Eingabe,I,1))>0 Then Ergebnis = Ergebnis & Mid(ZielAlphabet, Instr(QuellAlphabet, Mid(Eingabe,I,1)),1) Else Ergebnis = Ergebnis & Mid(Eingabe,I,1)

    Next

    Return Ergebnis

    End Function

    Wenn du in deinem Programm nun einen Text eingeben hast, kannst du z.B. mit MsgBox(Verschlüsseln(Textbox1.Text)) das verschlüsselte Resultat ausgeben. Dies kannst du natürlich auch in einen Button einbauen und das Resultat dann direkt wieder der Textbox oder einem Label zuweisen.

    Vorteil hier: eine einzige relativ überschaubare Schleife, nicht zu viel Code. Das Alphabet relativ kompakt in einer Variable gespeichert. Leichtes Testen mit anderen Alphabeten (z.B. wenn ein Kollege von dir die Zuordnung anders macht, tauscht ihr einfach euer ZielAlphabet-String aus).

    Für das Entschlüsseln müsstest du übrigens nur die Indizierung des eingegebenen Textes an dem Zielalphabet ausrichten und dann den Buchstaben des Quellalphabets ausgeben/addieren. Eine analoge Entschlüsseln-Funktion zu schreiben, kriegst damit du sicher selbst hin.

    Viel Erfolg.

    LG, Dennis.

    Freitag, 23. November 2012 12:23
  • Erstmal danke für die schnelle und ausführliche Hilfe!

    Nur leider programmieren wir in der Schule noch nicht, deshalb kann ich auch meinen Lehrer nicht fragen, weil es geheim bleiben soll. Es soll so eine Art Überraschung werden!

    Ich habe eure 3 Varianten mal ausprobiert und irgendwie funktionieren alle nicht. Es liegt wahrscheinlich an mangelnden Wissen, da ich nicht weiß wo und wie genau ich etwas ändern muss. Hilft es euch vielleicht wenn ich meinen ganzen Code und ein Bild von dem Programm hier poste ? Außerdem habe ich es mit der Vorlage:  http://www.youtube.com/watch?v=8wS9zfW6gg8 gemacht.  Nur in dem Video wird das Alphabet in Zeichen verschlüsselt. In dem Video klappt das auch super!

    Würde es euch was ausmachen, wenn einer von euch mir den Code schreibt, also nur mit dem verschlüsseln ?

    Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub 'Verschlüsseln Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If TextBox1.Text = "" Then Else Me.Text = "wird verschlüsselt...Bitte warten. Dieser Vorgang kann je nach Textlänge etwas dauern." Me.Enabled = False TextBox1.ReadOnly = True Button4.Enabled = True Button5.Enabled = True Dim i As Integer Dim strString As String Dim strNew As String strString = TextBox1.Text For i = Len(strString) To 1 Step -1 strNew = strNew & Mid$(strString, i, 1) Next i 'Zeichen TextBox1.Text = TextBox1.Text.Replace("?", "?") TextBox1.Text = TextBox1.Text.Replace("\", "\") TextBox1.Text = TextBox1.Text.Replace("!", "!") TextBox1.Text = TextBox1.Text.Replace(":", ":") TextBox1.Text = TextBox1.Text.Replace("|", "|") TextBox1.Text = TextBox1.Text.Replace("_", "_") TextBox1.Text = TextBox1.Text.Replace("{", "{") TextBox1.Text = TextBox1.Text.Replace("}", "}") TextBox1.Text = TextBox1.Text.Replace("%", "%") TextBox1.Text = TextBox1.Text.Replace("$", "$") TextBox1.Text = TextBox1.Text.Replace(".", ".") TextBox1.Text = TextBox1.Text.Replace(",", ",") TextBox1.Text = TextBox1.Text.Replace(";", ";") TextBox1.Text = TextBox1.Text.Replace("+", "+") 'Großbuchstaben TextBox1.Text = TextBox1.Text.Replace("A", "D") TextBox1.Text = TextBox1.Text.Replace("B", "E") TextBox1.Text = TextBox1.Text.Replace("C", "M") TextBox1.Text = TextBox1.Text.Replace("D", "X") TextBox1.Text = TextBox1.Text.Replace("E", "V") TextBox1.Text = TextBox1.Text.Replace("F", "S") TextBox1.Text = TextBox1.Text.Replace("G", "U") TextBox1.Text = TextBox1.Text.Replace("H", "N") TextBox1.Text = TextBox1.Text.Replace("I", "Z") TextBox1.Text = TextBox1.Text.Replace("J", "I") TextBox1.Text = TextBox1.Text.Replace("K", "J") TextBox1.Text = TextBox1.Text.Replace("L", "K") TextBox1.Text = TextBox1.Text.Replace("M", "A") TextBox1.Text = TextBox1.Text.Replace("N", "C") TextBox1.Text = TextBox1.Text.Replace("O", "B") TextBox1.Text = TextBox1.Text.Replace("P", "Q") TextBox1.Text = TextBox1.Text.Replace("Q", "O") TextBox1.Text = TextBox1.Text.Replace("R", "H") TextBox1.Text = TextBox1.Text.Replace("S", "F") TextBox1.Text = TextBox1.Text.Replace("T", "R") TextBox1.Text = TextBox1.Text.Replace("U", "P") TextBox1.Text = TextBox1.Text.Replace("V", "T") TextBox1.Text = TextBox1.Text.Replace("W", "L") TextBox1.Text = TextBox1.Text.Replace("X", "G") TextBox1.Text = TextBox1.Text.Replace("Y", "W") TextBox1.Text = TextBox1.Text.Replace("Z", "Y") Me.Text = "Geheimschrift by Felix" Me.Enabled = True End If End Sub 'Unverschlüsselt speichern Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click If TextBox1.Text = "" Then Else Dim ofd As New FolderBrowserDialog ofd.ShowDialog() Try System.IO.File.AppendAllText(ofd.SelectedPath + "\unverschlüsselt.txt", TextBox1.Text) Catch ex As Exception End Try End If End Sub 'Text löschen Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click TextBox1.Text = "" Button2.Enabled = False Button4.Enabled = False Button1.Enabled = True TextBox1.ReadOnly = False End Sub 'Öffnen Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim str As String Dim ofd As New OpenFileDialog ofd.Filter = "Textdateien (*.txt)|*.txt" ofd.Title = "Datei öffnen" ofd.ShowDialog() Try str = My.Computer.FileSystem.ReadAllText(ofd.FileName) Catch ex As Exception End Try TextBox1.Clear() TextBox1.Text = str End Sub 'Verschlüsselt speichern Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click If TextBox1.Text = "" Then Else Dim ofd As New FolderBrowserDialog ofd.ShowDialog() Try System.IO.File.AppendAllText(ofd.SelectedPath + "\verschlüsselt.txt", TextBox1.Text) Catch ex As Exception End Try End If End Sub 'Entschlüsseln Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If TextBox1.Text = "" Then Else Me.Text = "wird entschlüsselt...Bitte warten. Dieser Vorgang kann je nach Textlänge etwas dauern." Me.Enabled = False TextBox1.ReadOnly = True Button4.Enabled = True Button5.Enabled = True Dim i As Integer Dim strString As String Dim strNew As String strString = TextBox1.Text For i = Len(strString) To 1 Step -1 strNew = strNew & Mid$(strString, i, 1) Next i 'Zeichen TextBox1.Text = TextBox1.Text.Replace("?", "?") TextBox1.Text = TextBox1.Text.Replace("\", "\") TextBox1.Text = TextBox1.Text.Replace("!", "!") TextBox1.Text = TextBox1.Text.Replace(":", ":") TextBox1.Text = TextBox1.Text.Replace("|", "|") TextBox1.Text = TextBox1.Text.Replace("_", "_") TextBox1.Text = TextBox1.Text.Replace("{", "{") TextBox1.Text = TextBox1.Text.Replace("}", "}") TextBox1.Text = TextBox1.Text.Replace("%", "%") TextBox1.Text = TextBox1.Text.Replace("$", "$") TextBox1.Text = TextBox1.Text.Replace(".", ".") TextBox1.Text = TextBox1.Text.Replace(",", ",") TextBox1.Text = TextBox1.Text.Replace(";", ";") TextBox1.Text = TextBox1.Text.Replace("+", "+") 'Großbuchstaben TextBox1.Text = TextBox1.Text.Replace("D", "A") TextBox1.Text = TextBox1.Text.Replace("E", "B") TextBox1.Text = TextBox1.Text.Replace("M", "C") TextBox1.Text = TextBox1.Text.Replace("X", "D") TextBox1.Text = TextBox1.Text.Replace("V", "E") TextBox1.Text = TextBox1.Text.Replace("S", "F") TextBox1.Text = TextBox1.Text.Replace("U", "G") TextBox1.Text = TextBox1.Text.Replace("N", "H") TextBox1.Text = TextBox1.Text.Replace("Z", "I") TextBox1.Text = TextBox1.Text.Replace("I", "J") TextBox1.Text = TextBox1.Text.Replace("J", "K") TextBox1.Text = TextBox1.Text.Replace("K", "L") TextBox1.Text = TextBox1.Text.Replace("A", "M") TextBox1.Text = TextBox1.Text.Replace("C", "N") TextBox1.Text = TextBox1.Text.Replace("B", "O") TextBox1.Text = TextBox1.Text.Replace("Q", "P") TextBox1.Text = TextBox1.Text.Replace("O", "Q") TextBox1.Text = TextBox1.Text.Replace("H", "R") TextBox1.Text = TextBox1.Text.Replace("F", "S") TextBox1.Text = TextBox1.Text.Replace("R", "T") TextBox1.Text = TextBox1.Text.Replace("P", "U") TextBox1.Text = TextBox1.Text.Replace("T", "V") TextBox1.Text = TextBox1.Text.Replace("L", "W") TextBox1.Text = TextBox1.Text.Replace("G", "X") TextBox1.Text = TextBox1.Text.Replace("W", "Y") TextBox1.Text = TextBox1.Text.Replace("Y", "Z") Me.Text = "Geheimschrift by Felix" Me.Enabled = True End If End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick TextBox1.CharacterCasing = CharacterCasing.Upper End Sub End Class

    [url=http://www.fotos-hochladen.net/view/1qwyngusbxo.png][img]http://img3.fotos-hochladen.net/thumbnail/1qwyngusbxo_thumb.jpg[/img][/url]

    Der verschlüsselte Text wird dann wieder in dem selben Textfenster ausgegeben, also der Originaltext wird durch den verschlüsselten Text ausgetauscht.

    Ich bedanke mich schonmal im Vorraus!

    Freitag, 23. November 2012 17:21
  • In dem verlinkten Video wird jedes Zeichen durch eine Zeichenkette ersetzt, die es im normalen Schriftgebrauch nicht gibt. Wenn du jedes Zeichen durch ein neues, wieder einzelnes ersetzen willst, muss du so vorgehen wie wir dir geschriebe haben. Für den Anfang, wenn man noch nicht so viel erfahrung beim Programmieren hat, so denke ich, ist die Möglichkeit von Gloewer oder meine 2. am besten geeignet.

    In diesem Fall werden alle Zeichen nacheinander durchgegangen und das momentan untersuchte Zeichen durch das Äquivalent ersetzt. 2 Möglichkeiten dafür hast du ja bereits, wobei ich mehr mit .NET Mitteln vorgegangen bin und GLoewer mit "alten" VB Funktionen.

    Ich habe jetzt mal meinen Code genommen und in deine Methode eingebaut:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If TextBox1.Text = "" Then
            Else
                Me.Text = "wird verschlüsselt...Bitte warten. Dieser Vorgang kann je nach Textlänge etwas dauern."
    
                Me.Enabled = False
                TextBox1.ReadOnly = True
                Button4.Enabled = True
                Button5.Enabled = True
               
              
    Dim sb As New StringBuilder()
    Dim cs As Char() = TextBox1.Text.ToCharArray()
    For i As Integer = 0 To cs.Length - 1
    	Select Case cs(i)
    		Case "A"C
    			sb.Append("D")
    			Exit Select
    		Case "B"C
    			sb.Append("E")
    			Exit Select
                    'Die fehlenden Zeichen in der Syntax wie oben ergänzen
    		Case Else
                            'Unbekanntes Zeichen: Einfach übernehmen
    			sb.Append(cs(i))
    			Exit Select
    	End Select
    Next
    TextBox1.Text = sb.ToString()
    
    
                Me.Text = "Geheimschrift by Felix"
                Me.Enabled = True
            End If
        End Sub

    Beim entschlüsseln musst du im Select Case Beispielsweise so vorgehen:

    		Case "D"C
    			sb.Append("A")
    			Exit Select
    		Case "E"C
    			sb.Append("B")
    			Exit Select

    Den Default-Wert solltest du natürlich auch noch übernehmen.



    Koopakiller [kuːpakɪllɐ] - http://koopakiller.ko.ohost.de/

    Freitag, 23. November 2012 17:43
    Moderator
  • Das hat mir echt weitergeholfen! Ich danke dir!

    Nur ein Problem hab ich noch und zwar wenn ich "StringBuilder()" eingebe, dann bekomme ich die Fehlermeldung:  'Der Typ "StringBuilder" ist nicht definiert.'   Deswegen funktioniert es auch nicht. Was kann ich dagegen tuen ?

    So müsste es richtig sein oder ?

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If TextBox1.Text = "" Then
            Else
                Me.Text = "wird verschlüsselt...Bitte warten. Dieser Vorgang kann je nach Textlänge etwas dauern."
    
                Me.Enabled = False
                TextBox1.ReadOnly = True
                Button4.Enabled = True
                Button5.Enabled = True
    
    
                Dim sb As New StringBuilder()
                Dim cs As Char() = TextBox1.Text.ToCharArray()
                For i As Integer = 0 To cs.Length - 1
                    Select Case cs(i)
                        Case "A"c
                            sb.Append("D")
                            Exit Select
                        Case "B"c
                            sb.Append("E")
                            Exit Select
                        Case "C"c
                            sb.Append("M")
                            Exit Select
                        Case "D"c
                            sb.Append("X")
                            Exit Select
                        Case "E"c
                            sb.Append("V")
                            Exit Select
                        Case "F"c
                            sb.Append("S")
                            Exit Select
                        Case "G"c
                            sb.Append("U")
                            Exit Select
                        Case "H"c
                            sb.Append("N")
                            Exit Select
                        Case "I"c
                            sb.Append("Z")
                            Exit Select
                        Case "J"c
                            sb.Append("I")
                            Exit Select
                        Case "K"c
                            sb.Append("J")
                            Exit Select
                        Case "L"c
                            sb.Append("K")
                            Exit Select
                        Case "M"c
                            sb.Append("A")
                            Exit Select
                        Case "N"c
                            sb.Append("C")
                            Exit Select
                        Case "O"c
                            sb.Append("B")
                            Exit Select
                        Case "P"c
                            sb.Append("Q")
                            Exit Select
                        Case "Q"c
                            sb.Append("O")
                            Exit Select
                        Case "R"c
                            sb.Append("H")
                            Exit Select
                        Case "S"c
                            sb.Append("F")
                            Exit Select
                        Case "T"c
                            sb.Append("R")
                            Exit Select
                        Case "U"c
                            sb.Append("P")
                            Exit Select
                        Case "V"c
                            sb.Append("T")
                            Exit Select
                        Case "W"c
                            sb.Append("L")
                            Exit Select
                        Case "X"c
                            sb.Append("G")
                            Exit Select
                        Case "Y"c
                            sb.Append("W")
                            Exit Select
                        Case "Z"c
                            sb.Append("Y")
                            Exit Select
                        Case " "c
                            sb.Append(" ")
                            Exit Select
    
                        Case Else
    
                            sb.Append(cs(i))
                            Exit Select
                    End Select
                Next
                TextBox1.Text = sb.ToString()
    
    
                Me.Text = "Geheimschrift by Felix"
                Me.Enabled = True
            End If
        End Sub

    Nur halt dann beim Entschlüsseln genau wie du es beschrieben hast.

    Freitag, 23. November 2012 19:12
  • Da hilft IntelliSense ;)

    Zeige mit der Maus auf StringBuilder, Irgendwo unter dem Wort taucht so ein kleines Rechteck auf, wo du drauf klicken musst. Dann bekommst du Vorschläge was du machen kannst, unter anderem auch "Importieren Sie "System.Text""

    Oder kurz, was die wahrscheinlich schon gereicht hätte: Setze folgende Zeile an den Anfang der Datei:

    Imports System.Text

    Soweit ich das jetzt sehen kann ist dein Code richtig.

    Nur noch so am Rande, dein Code wird im selben Thread ausgeführt wie die GUI, d.h. das der Benutzer nicht mitbekommt vom deaktivieren der Buttons oder dem Ändern der Texte. Mann müsste das ganze verschlüsselb in einen 2. Thread rein packen, wobei das sicherlich etwas deinen Lernfortschritt übersteigt. Und so lange sollte deine Kodierung nicht dauern, das der Benutzer denkt, das das Programm abgestürtzt ist. Gib einfach mal 1000000 Zeichen zum  Kodieren ein und das Programm scheint einen kleinen Hänger zu bekommen. Zugegeben, diese Zahl ist einfach unrealistisch.


    Koopakiller [kuːpakɪllɐ] - http://koopakiller.ko.ohost.de/


    Freitag, 23. November 2012 19:18
    Moderator
  • Okay, geändert hab ich es und es klappt. Nur wenn ich es jetzt mit einem A ausprobiere, wird es wieder ein A.

    Also das Programm macht was aber es kommt wieder nur ein A raus. Willst du das Programm mal testen ?

    So nebenbei, tut mir leid, dass ich euch unnötig mit meinen Kindergartenproblemen belästige!

    Freitag, 23. November 2012 19:34
  • Ich teste es gern mal, kein Problem. Wenn du den Code 1:1 wie in deinem 2 letzten Post eingebaut hast, dann sollte es funktionieren. Wenn ich den Code bei mir einfüge fuunktioniert alles:

    DAS IST EIN KLEINER TEST: MAL SEHEN WIE DAS DANN SO FUNKTIONIERT
    ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"§$%&/()=?ß\}][{³²

    wird zu

    XDF ZFR VZC JKVZCVH RVFR: ADK FVNVC LZV XDF XDCC FB SPCJRZBCZVHR
    DEMXVSUNZIJKACBQOHFRPTLGWY0123456789!"§$%&/()=?ß\}][{³²

    also genauso wie es sein sollte.

    Auch wenn deine Fragen das Einfachste betreffen, es hat jeder mal angefangen ;)

    Was mir gerade noch auffällt: Es ist absolut ineffektiv einen Timer laufen zu lassen, der Ständig alles in Großbuchstaben zu wandeln. Mache das Lieber im TextChanged-Ereignis. Ist zwar auch nicht das effektiffste, aber es geht und ist schon effektiver als der Timer ;)


    Koopakiller [kuːpakɪllɐ] - http://koopakiller.ko.ohost.de/

    Freitag, 23. November 2012 19:50
    Moderator
  • Cool danke. :) Habe ich und halt zum entschlüsseln hab ich das halt auch reingesetzt und wenn ich den code fürs entschlüsseln rausnehme, dann funktionierts! Aber mit entschlüsseln nicht :(

    Wenn ich mal fragen darf, wie hast du denn angefangen ? :)

    Freitag, 23. November 2012 21:36
  • Mein Code war der zum verschlüsseln. Zum entschlüsseln muss man im Select Case das "Suchzeichen" mit dem "Ersetzzeichen" austauschen:

                    Select Case cs(i)
                        Case "D"c
                            sb.Append("A")
                            Exit Select
                        Case "E"c
                            sb.Append("B")
                            Exit Select
                        Case "M"c
                            sb.Append("C")
                            Exit Select
                        Case "X"c
                            sb.Append("D")
                            Exit Select
                        Case "V"c
                            sb.Append("E")
                            Exit Select
    'usw...

    Man muss bei Verschlüsslungs/Komprimierungsmethoden "einfach" versuchen die Logik auf den Kopf zu stellen, in diesem Fall alles rückwärts zu ersetzen.


    Ich habe mich schon seit dem ich denken kann für Computer interesiert. Dann irgendwann hat es mich interesiert wie Computer und Programme funktionieren und habe angefangen das versucht nachzuahmen, also kleinste Teilchen der Funktionen. Seit etwas über einem Jahr programmiere ich fast auschließlich  mit .NET. Wobei es seit dem ein recht steiler Aufstieg war, ich wollte etwas programmieren und suchte meistens solange bis es funktioniert hat. Im Grunde brachte ich mir alles selbst bei, was ich nicht verstand fragte ich nach.


    Koopakiller [kuːpakɪllɐ] - http://koopakiller.ko.ohost.de/

    Freitag, 23. November 2012 21:47
    Moderator
  • Ah, sorry. Hatte eben einen Tippfehler drin..jetzt funktionierts auch! Danke, ich wart meine letzte Rettung, ich war schon fast am verzweifeln!

    Programmierst du nur als Hobby oder machst du das auch als Beruf ?

    Freitag, 23. November 2012 21:59
  • Ahja jetzt, hatte eben nur ein Tippfehler..danke! Ihr wart meine letzte Rettung! Ich war schon am verzweifeln!

    Programmierst du nur so als Hobby oder machst du das als Beruf ?

    Freitag, 23. November 2012 22:02
  • Gut, das es jetzt funktioniert ;)

    Da ich momentan noch in der schulischen Ausbildung bin, habe ich Programmieren nur als Hobby, strebe jedoch einen Beruf im Bereich .NET Entwicklung an.


    Koopakiller [kuːpakɪllɐ] - http://koopakiller.ko.ohost.de/

    Freitag, 23. November 2012 22:22
    Moderator
  • Oh sehr cool ;)

    Ich werde jetzt auch im Sommer des nächsten Jahres eine schulische Ausbildung zum Fachinformatiker - Anwendungsentwicklung antreten.

    Freitag, 23. November 2012 22:35
  • Halo Felix,

    das ist ja alles ganz nett.

    Warum benutzt Du nicht den TripleDES algorithm von NET.

    Hier habe ich etwas dazu geschrieben.

    Interessant für Dich sind die beiden Funktionen

    - DecryptData

    - EncryptData

    Gruss Ellen


    (VB2008 Express, VB2010 Express, VST2008 professional) Ellens Codegallerie

    Sonntag, 25. November 2012 19:02
  • Hallo Ellen,

    da es ein Informatikprojekt ist, wollte ich soweit es geht, meinen eigenen Beitrag leisten. Deshalb nehme ich lieber die oben beschriebene Methode, aber trotzdem danke für deine Hilfe! :)

    Gruß Felix

    Sonntag, 25. November 2012 19:14
  • Ich war mal so frei und hab dir zu meiner Idee auch eine kleine Komplettimplementation geschrieben. Viel Erfolg damit, falls du sie verwenden kannst/willst.

    Imports System.IO
    Public Class Form1
        Dim InputFileName As String
        Dim OutputFileName As String
        Dim EncFileName As String
        Dim DecFileName As String
        Dim EncAlphabet As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        Dim DecAlphabet As String = "NOPQRSTUVWXYZABCDEFGHIJKLM"
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ProgrammInitialisieren()
        End Sub
        Private Sub ProgrammInitialisieren()
            TextBox1.Text = "NUR EIN KLEINER SIMPLER TESTTEXT MIT 1 ODER 2 ZAHLEN DRIN."
            'Tabellen ausrichten
            TableLayoutPanel1.Dock = DockStyle.Fill
            TableLayoutPanel2.Dock = DockStyle.Fill
            TableLayoutPanel3.Dock = DockStyle.Fill
            'Textboxen ausrichten
            Dim TextBoxList As List(Of TextBox) = New List(Of TextBox) From {TextBox3, TextBox4, TextBox5, TextBox6}
            For Each TB As TextBox In TextBoxList
                TB.Dock = DockStyle.Fill
            Next
            'Labels ausrichten und einstellen
            Dim LabelList As List(Of Label) = New List(Of Label) From {Label1, Label2, Label3, Label4, Label5, Label6, Label7, Label8, Label9, Label10}
            For Each L As Label In LabelList
                L.TextAlign = ContentAlignment.MiddleRight
                L.Dock = DockStyle.Fill
            Next
            'Buttons einrichten
            Dim ButtonList As List(Of Button) = New List(Of Button) From {Button1, Button2, Button3, Button4, Button5, Button6, Button7, Button8, Button9, Button10}
            For Each B As Button In ButtonList
                B.Dock = DockStyle.Fill
                B.TextAlign = ContentAlignment.MiddleCenter
                B.Text = "Browse"
            Next
            Button5.Text = "Encrypt"
            Button10.Text = "Decrypt"
            AddHandler Button1.Click, AddressOf QuellTextLaden
            AddHandler Button2.Click, AddressOf QuellTextSpeichern
            AddHandler Button3.Click, AddressOf QuellAlphabetLaden
            AddHandler Button4.Click, AddressOf QuellAlphabetSpeichern
            AddHandler Button5.Click, AddressOf Verschluesseln
            AddHandler Button6.Click, AddressOf ZielTextLaden
            AddHandler Button7.Click, AddressOf ZielTextSpeichern
            AddHandler Button8.Click, AddressOf ZielAlphabetLaden
            AddHandler Button4.Click, AddressOf ZielAlphabetSpeichern
            AddHandler Button10.Click, AddressOf Entschluesseln
            Anzeigen()
        End Sub
        Private Sub Verschluesseln(ByVal sender As Object, ByVal e As EventArgs)
            If Not AlphabetCorrect() Then
                MsgBox("Alphabet enthält Fehler!")
                Exit Sub
            End If
            TextBox2.Text = ""
            For Each C As Char In TextBox1.Text
                If InStr(EncAlphabet, C) > 0 Then TextBox2.Text = TextBox2.Text & Mid(DecAlphabet, InStr(EncAlphabet, C), 1) Else TextBox2.Text = TextBox2.Text & C
            Next
        End Sub
        Private Sub Entschluesseln(ByVal sender As Object, ByVal e As EventArgs)
            If Not AlphabetCorrect() Then
                MsgBox("Alphabet enthält Fehler!")
                Exit Sub
            End If
            TextBox1.Text = ""
            For Each C As Char In TextBox2.Text
                If InStr(DecAlphabet, C) > 0 Then TextBox1.Text = TextBox1.Text & Mid(EncAlphabet, InStr(DecAlphabet, C), 1) Else TextBox1.Text = TextBox1.Text & C
            Next
        End Sub
        Private Function AlphabetCorrect() As Boolean
            For Each C As Char In EncAlphabet
                If Not DecAlphabet.Contains(C) Then Return False
            Next
            For Each C As Char In DecAlphabet
                If Not EncAlphabet.Contains(C) Then Return False
            Next
            Return True
        End Function
        Private Sub QuellAlphabetLaden(ByVal sender As Object, ByVal e As EventArgs)
            Dim OFD As OpenFileDialog = New OpenFileDialog
            With OFD
                .FileName = EncFileName
                .CheckFileExists = True
                .CheckPathExists = True
                .DefaultExt = "*.*"
                .Filter = "Alle Dateien (*.*)|*.*"
                .Multiselect = False
            End With
            Dim Ret As DialogResult = OFD.ShowDialog()
            Dim SR As StreamReader
            If Ret = Windows.Forms.DialogResult.OK Then
                EncFileName = OFD.FileName
                SR = New StreamReader(EncFileName)
                EncAlphabet = SR.ReadToEnd
                SR.Close()
            End If
            Anzeigen()
        End Sub
        Private Sub QuellAlphabetSpeichern(ByVal sender As Object, ByVal e As EventArgs)
            Dim SFD As SaveFileDialog = New SaveFileDialog
            With SFD
                .FileName = EncFileName
                .CheckFileExists = False
                .CheckPathExists = True
                .DefaultExt = "*.*"
                .Filter = "Alle Dateien (*.*)|*.*"
            End With
            Dim Ret As DialogResult = SFD.ShowDialog()
            Dim SW As StreamWriter
            If Ret = Windows.Forms.DialogResult.OK Then
                EncFileName = SFD.FileName
                SW = New StreamWriter(EncFileName)
                SW.Write(EncAlphabet)
                SW.Flush()
                SW.Close()
            End If
            Anzeigen()
        End Sub
        Private Sub ZielAlphabetLaden(ByVal sender As Object, ByVal e As EventArgs)
            Dim OFD As OpenFileDialog = New OpenFileDialog
            With OFD
                .FileName = DecFileName
                .CheckFileExists = True
                .CheckPathExists = True
                .DefaultExt = "*.*"
                .Filter = "Alle Dateien (*.*)|*.*"
                .Multiselect = False
            End With
            Dim Ret As DialogResult = OFD.ShowDialog()
            Dim SR As StreamReader
            If Ret = Windows.Forms.DialogResult.OK Then
                DecFileName = OFD.FileName
                SR = New StreamReader(DecFileName)
                DecAlphabet = SR.ReadToEnd
                SR.Close()
            End If
            Anzeigen()
        End Sub
        Private Sub ZielAlphabetSpeichern(ByVal sender As Object, ByVal e As EventArgs)
            Dim SFD As SaveFileDialog = New SaveFileDialog
            With SFD
                .FileName = DecFileName
                .CheckFileExists = False
                .CheckPathExists = True
                .DefaultExt = "*.*"
                .Filter = "Alle Dateien (*.*)|*.*"
            End With
            Dim Ret As DialogResult = SFD.ShowDialog()
            Dim SW As StreamWriter
            If Ret = Windows.Forms.DialogResult.OK Then
                DecFileName = SFD.FileName
                SW = New StreamWriter(DecFileName)
                SW.Write(DecAlphabet)
                SW.Flush()
                SW.Close()
            End If
            Anzeigen()
        End Sub
        Private Sub QuellTextLaden(ByVal sender As Object, ByVal e As EventArgs)
            Dim OFD As OpenFileDialog = New OpenFileDialog
            With OFD
                .FileName = InputFileName
                .CheckFileExists = True
                .CheckPathExists = True
                .DefaultExt = "*.*"
                .Filter = "Alle Dateien (*.*)|*.*"
                .Multiselect = False
            End With
            Dim Ret As DialogResult = OFD.ShowDialog()
            Dim SR As StreamReader
            If Ret = Windows.Forms.DialogResult.OK Then
                InputFileName = OFD.FileName
                SR = New StreamReader(InputFileName)
                TextBox1.Text = SR.ReadToEnd
                SR.Close()
            End If
            Anzeigen()
        End Sub
        Private Sub QuellTextSpeichern(ByVal sender As Object, ByVal e As EventArgs)
            Dim SFD As SaveFileDialog = New SaveFileDialog
            With SFD
                .FileName = OutputFileName
                .CheckFileExists = False
                .CheckPathExists = True
                .DefaultExt = "*.*"
                .Filter = "Alle Dateien (*.*)|*.*"
            End With
            Dim Ret As DialogResult = SFD.ShowDialog()
            Dim SW As StreamWriter
            If Ret = Windows.Forms.DialogResult.OK Then
                InputFileName = SFD.FileName
                SW = New StreamWriter(InputFileName)
                SW.Write(TextBox1.Text)
                SW.Flush()
                SW.Close()
            End If
            Anzeigen()
        End Sub
        Private Sub ZielTextLaden(ByVal sender As Object, ByVal e As EventArgs)
            Dim OFD As OpenFileDialog = New OpenFileDialog
            With OFD
                .FileName = OutputFileName
                .CheckFileExists = True
                .CheckPathExists = True
                .DefaultExt = "*.*"
                .Filter = "Alle Dateien (*.*)|*.*"
                .Multiselect = False
            End With
            Dim Ret As DialogResult = OFD.ShowDialog()
            Dim SR As StreamReader
            If Ret = Windows.Forms.DialogResult.OK Then
                OutputFileName = OFD.FileName
                SR = New StreamReader(OutputFileName)
                TextBox1.Text = SR.ReadToEnd
                SR.Close()
            End If
            Anzeigen()
        End Sub
        Private Sub ZielTextSpeichern(ByVal sender As Object, ByVal e As EventArgs)
            Dim SFD As SaveFileDialog = New SaveFileDialog
            With SFD
                .FileName = OutputFileName
                .CheckFileExists = False
                .CheckPathExists = True
                .DefaultExt = "*.*"
                .Filter = "Alle Dateien (*.*)|*.*"
            End With
            Dim Ret As DialogResult = SFD.ShowDialog()
            Dim SW As StreamWriter
            If Ret = Windows.Forms.DialogResult.OK Then
                OutputFileName = SFD.FileName
                SW = New StreamWriter(OutputFileName)
                SW.Write(TextBox2.Text)
                SW.Flush()
                SW.Close()
            End If
            Anzeigen()
        End Sub
        Private Sub Anzeigen()
            Label1.Text = "Öffne Quelldatei"
            Label2.Text = "Speichere Quelldatei"
            Label3.Text = "Öffne Quellalphabet"
            Label4.Text = "Speichere Quellalphabet"
            Label5.Text = "Starte Verschlüsselung"
            Label6.Text = "Öffne Zieldatei"
            Label7.Text = "Speichere Zieldatei"
            Label8.Text = "Öffne Zielalphabet"
            Label9.Text = "Speichere Zielalphabet"
            Label10.Text = "Starte Entschlüsselung"
            '
            TextBox3.Text = InputFileName
            TextBox4.Text = EncAlphabet
            TextBox5.Text = OutputFileName
            TextBox6.Text = DecAlphabet
        End Sub
        Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
            InputFileName = TextBox3.Text
        End Sub
        Private Sub TextBox5_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox5.TextChanged
            OutputFileName = TextBox5.Text
        End Sub
        Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged
            EncAlphabet = TextBox4.Text
        End Sub
        Private Sub TextBox6_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox6.TextChanged
            DecAlphabet = TextBox6.Text
        End Sub
    End Class
    

    Für die Optik füge bitte in eine leere Form ein TableLayoutPanel1 ein (2x2 Zellen).

    In die rechte obere Zelle eine Textbox1, in die rechte untere eine Textbox2.

    Die linke obere und untere Zelle enthalten jeweils ein weiteres TableLayoutPanel (oben ...2 unten ...3).

    Diese sind - zweispaltig - wie folgt aufgebaut:

    - Zeile 1 und 2: Links Label1/2, rechts Button1/2

    - Zeile 4 und 5: analog Label 3/4, Button 3/4

    - Zeile 3 und 6 enthalten je links nur eine Textbox (TB3 bzw. 4)

    - Zuletzt noch in Zeile 7 wieder ein Label5 und Button5.

    - Das untere baut sich völlig analog auf (Textbox 5 und 6, Labels 6-10, Buttons 6-10)

    Um es etwas übersichtlicher zu halten, gib allen kleinen TableLayout-Zeilen die Höhe 32 Absolut, eine weitere Leerzeile mit Höhe 100% relativ. Die Breiten aller TableLayouts sind bei mir ca. 60:40%.

    Die Optik ist sicher verbesserungswürdig. Aber funktionieren tuts.

    Voreingestellt hab ich zum Testen übrigens eine einfache Umsetzung von ROT13, also ein Verschieben des Alphabets um 13 Zeichen.

    LG, Dennis.

    Montag, 26. November 2012 14:39
  • Danke sehr! Werde ich gleich nach der Schule mal ausprobieren! :)

    Gibt es eigentlich auch eine Lösung, dass man das Zielalphabet selbst festlegen kann also der Benutzer ? Und kennt ihr eine gute Lösung mit der das Programm selbst ein Text entschlüsselt, von dem er das Alphabet gar nicht kennt ? Wir haben da irgendwie in der Schule gelernt, dass jeder Buchstabe eine bestimmte Prozentzahl hat wie oft er in Texten vorkommt. Könnte das auch gehen ?

    LG, Felix.

    Dienstag, 27. November 2012 06:27
  • Hi Felix.

    Grundsätzlich ist es richtig, dass in einem durchschnittlichen Text einer gewissen Sprache, die Häufigkeit eines Buchstabens signifikant ist. Man kann bei einfachen Verschlüsselungen, die z.B. nur auch einer Alphabet-Verschiebung oder Substitution eines Zeichens durch ein anderes beruhen, auf diese Weise den Text herausbekommen, wenn man die Sprache weiß, und der Text hinreichend lang ist (so dass die Häufigkeit auch zum Tragen kommt). Je kürzer der Text, desto schwieriger ist das also.

    Am Besten wäre, du liest einmal ein wenig im Netz, was dein Freund Google dort auswirft, wenn du ihm Suchwörter wie "Caesar-Chiffre", "Symmetrische Verschlüsselung" oder "Kryptoanalyse" zum fressen vorwirfst. Denn genau letztere beschäftigt sich mit dem analysieren bzw. "knacken" von Codes (natürlich eher im Hinblick darauf, wie sicher ein Code ist).

    Kurz angemerkt: in Dot.Net gibt es soweit ich weiss eine eigene Library "System.Security.Cryptography", die einige Standard-Verfahren beherrscht, so dass man damit mal etwas rumspielen kann, ohne jetzt das Rad neu erfinden zu müssen. Die MSDN-Hilfe gibt dir dazu sicher noch weitere Infos.

    LG, Dennis.

    Dienstag, 27. November 2012 08:39
  • Hi Dennis.

    Ja, das habe ich mir schon gedacht. Naja ich werds mal weiter im Netz probieren.

    LG, Felix.

    Dienstag, 27. November 2012 15:20