Den Buchstaben "A" verschlüsseln
-
Donnerstag, 22. November 2012 16:05
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
- Typ geändert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Freitag, 23. November 2012 10:42 Frage
- Bearbeitet Robert BreitenhoferMicrosoft Contingent Staff, Moderator Freitag, 23. November 2012 10:42 Titel war: Schulprojekt
- Verschoben Robert BreitenhoferMicrosoft Contingent Staff, Moderator Freitag, 23. November 2012 10:43 Visual Basic.NET (aus:Off-Topic)
Alle Antworten
-
Freitag, 23. November 2012 11:33Moderator
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:45
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 12:23
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 17:21
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:43Moderator
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 SubBeim 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 SelectDen Default-Wert solltest du natürlich auch noch übernehmen.
Koopakiller [kuːpakɪllɐ] - http://koopakiller.ko.ohost.de/
-
Freitag, 23. November 2012 19:12
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 SubNur halt dann beim Entschlüsseln genau wie du es beschrieben hast.
-
Freitag, 23. November 2012 19:18Moderator
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/
- Bearbeitet KoopakillerMicrosoft Community Contributor, Moderator Freitag, 23. November 2012 19:23 ergänzung zum GUI/2. Thread
-
Freitag, 23. November 2012 19:34
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:50Moderator
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 21:36
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:47Moderator
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:59
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 22:02
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:22Moderator
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:35
Oh sehr cool ;)
Ich werde jetzt auch im Sommer des nächsten Jahres eine schulische Ausbildung zum Fachinformatiker - Anwendungsentwicklung antreten.
-
Sonntag, 25. November 2012 19:02
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:14
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
-
Montag, 26. November 2012 14:39
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 ClassFü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.
-
Dienstag, 27. November 2012 06:27
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 08:39
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 15:20
Hi Dennis.
Ja, das habe ich mir schon gedacht. Naja ich werds mal weiter im Netz probieren.
LG, Felix.

