Cäsar Verschlüsselung
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 145 Antworten in diesem Thema. Der letzte Beitrag () ist von get_banned.
-
-
Vatter schrieb:
und dann in der aufrufenden Sub deine Werte für Rotation usw. setzen
Die Werte für die Rotation sollen ja über ein Textfeld eingebbar sein und nicht einen festen Wert haben. Also muss ich ja dann in der Sub auf das Eingabefeld für Rotation zugreifen?! -
get_banned schrieb:
Vatter schrieb:
und dann in der aufrufenden Sub deine Werte für Rotation usw. setzen
Die Werte für die Rotation sollen ja über ein Textfeld eingebbar sein und nicht einen festen Wert haben. Also muss ich ja dann in der Sub auf das Eingabefeld für Rotation zugreifen?!
Nein! du deklarierst den rotationswert eben in deinem hauptprogramm (Dim rotation As String = textbox.text() oder so ) und übergibst ihn als Parameter bei Funktionsaufruf:
VB.NET-Quellcode
- caesar(rotation, text, usw...)
- Function caesar(ByVal rotation As String, ByVal text As String, usw...)
- 'hier kannst du die variablen dann ohne deklaration verwenden
- 'machst du das so, ist die Funktion "mobil", natürlich kannst du auch in der funktion "Dim rotation As String = textbox.text()" machen... (denk noch dran, das die funktion den rotationswert als int braucht , also noch umwandeln (dabei kannst du dann auch abfragen , ob das wirklich eine zahl ist usw (deswegen hab ich das noch nicht gemacht)))
- End Function
-
Quellcode
- Public Class Form1
- Dim unverschlüsselt As Char() = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
- Dim Rotation As Integer = TextBox.Text()
- Dim Lösung As Integer
- Dim Zahl As Integer
- Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
- Function Public Class (ByVal rotation As Integer, ByVal Lösung As Integer, ByVal Zahl As Integer)
- If Asc(unverschlüsselt) >= 65 And Asc(unverschlüsselt) <= 90 Then
- Zahl = Asc(unverschlüsselt) + Rotation
- End If
- If Asc(unverschlüsselt) >= 97 And Asc(unverschlüsselt) <= 122 Then
- Zahl = Asc(unverschlüsselt) + Rotation
- End If
- If Zahl >= 65 And Zahl <= 90 Then
- Zahl = Lösung
- End If
- If Zahl >= 97 And Zahl <= 122 Then
- Zahl = Lösung
- End If
- If Zahl > 90 Then
- Lösung = Zahl - 90 + 64
- End If
- If Zahl > 122 Then
- Lösung = Zahl - 122 + 96
- End If
- MsgBox(Chr(Lösung))
- End Function
- End Class
Meisnt du in etwas so? Ich versteh nicht so ganz was es mit der Funktion jetzt auf sich hat, bzw wo die hin soll.Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „get_banned“ ()
-
du kannst Functionen und Subs nicht verschachteln
VB.NET-Quellcode
- Public Class/Module/Enum/Structure/Interface
- ' Beispiel ist ohne Modifier bei den Functions/Subs. Die kannst du natürlich noch hinzufügen
- Sub SubName(ByVal Params As Object)
- End Sub
- Function FuncName() As Object
- Return New Object() ' natürlich irgendetwas logisches mit Wert zurückgeben :D
- End Function
- End Class/Module/Enum/Structure/Interface
- ' das hier noch ein Namespace ist für dich noch irrelevant
Gruß Mangafreak
-
So in etwa sollte es aussehn:
VB.NET-Quellcode
- Public Class Form1
- Dim unverschlüsselt As Char() = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
- Dim Rotation As Integer = TextBox.Text()
- Dim Zahl As Integer
- Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
- Dim Lösung As Integer = caesar(Rotation, Zahl)
- MsgBox(Lösung)
- ODER!:
- MsgBox(caesar(Roatation, Zahl) ' so kannst du dir die variable Lösung sparen, wenn du diese später nicht noch brauchst...
- End Sub
- Function caesar (ByVal rotation As Integer, ByVal Zahl As Integer) As Integer 'hier gibst du an, wie der rückgabewert deiner funktion ist
- Dim Lösung As Integer = 0
- If Asc(unverschlüsselt) >= 65 And Asc(unverschlüsselt) <= 90 Then
- Zahl = Asc(unverschlüsselt) + Rotation
- End If
- If Asc(unverschlüsselt) >= 97 And Asc(unverschlüsselt) <= 122 Then
- Zahl = Asc(unverschlüsselt) + Rotation
- End If
- If Zahl >= 65 And Zahl <= 90 Then
- Zahl = Lösung
- End If
- If Zahl >= 97 And Zahl <= 122 Then
- Zahl = Lösung
- End If
- If Zahl > 90 Then
- Lösung = Zahl - 90 + 64
- End If
- If Zahl > 122 Then
- Lösung = Zahl - 122 + 96
- End If
- Return Lösung
- End Function
- End Class
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „buettner123“ ()
-
-
Mangafreak1995 schrieb:
du kannst Functionen und Subs nicht verschachteln
Klar kann man
OK, die innere funktion ist jetzt etwas unsinnig, zeigt aber dass es geht! MEHRZEILIGE Funktionen/Sub gehen natürlich erst in VB.2010 -
Meine Lösung sieht jetzt so aus:
Quellcode
- Public Class Form1
- Dim unverschlüsselt As Char() = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
- Dim Rotation As Integer = TextBox.Text()
- Dim Zahl As Integer
- Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
- Dim Lösung As Integer = caesar(Rotation, Zahl)
- MsgBox(Lösung)
- End Sub
- Function caesar(ByVal rotation As Integer, ByVal Zahl As Integer) As Integer 'hier gibst du an, wie der rückgabewert deiner funktion ist
- Dim Lösung As Integer = 0
- If Asc(unverschlüsselt) >= 65 And Asc(unverschlüsselt) <= 90 Then
- Zahl = Asc(unverschlüsselt) + rotation
- End If
- If Asc(unverschlüsselt) >= 97 And Asc(unverschlüsselt) <= 122 Then
- Zahl = Asc(unverschlüsselt) + rotation
- End If
- If Zahl >= 65 And Zahl <= 90 Then
- Zahl = Lösung
- End If
- If Zahl >= 97 And Zahl <= 122 Then
- Zahl = Lösung
- End If
- If Zahl > 90 Then
- Lösung = Zahl - 90 + 64
- End If
- If Zahl > 122 Then
- Lösung = Zahl - 122 + 96
- End If
- Return Lösung
- End Function
- End Class
Jedoch meldet er jetzt noch einige Fehler vom Typ:
"Fehler bei der Überladungsauflösung, da keine zugreifbare "Asc" mit diesen Argumenten aufgerufen werden kann:
'Public Function Asc(String As String) As Integer': Der Wert vom Typ "System.Windows.Forms.TextBox" kann nicht in "String" konvertiert werden.
'Public Function Asc(String As Char) As Integer': Der Wert vom Typ "System.Windows.Forms.TextBox" kann nicht in "Char" konvertiert werden."
Wo liegt das Problem? -
Sie dir ma im debug den Wert von Rotation an. Deine Textbox heißt sicher nicht nur Textbox.Text sondern Textbox1.Text oder so.
Außerdem bin ich skeptisch bei ASC(unverschlüsselt)+Rotation. unverschlüsselt ist ein Array, die Funktion ASC will aber einen String, also z.B. ASC (unverschlüsselt(index)).
Und schalte ma endlich Option Strict On ein. Sowas hier "Dim Rotation As Integer = TextBox.Text()" wird dann nämlich wegen fehlender Konvertierung unterstrichen.
Fiel Fergnügen
Vatter
Edita: Nochwas... sieh dir beim proggen ma genau an, was die Intellisense anzeigt. Du kannst dir für alle Überladungen die verlangten Parameter ansehen und wenn was unklar ist, die Taste F1 befindet sich oben links neben ESC.Seit 26.Mai 2012 Oppa! -
Option strict ist jetzt auf on, unterstrichen wird aber nichts. Wie finde ich denn den Namen der Textbox Rotation heraus? Laut den Eigenschaften der Textbox ist er ja eigentlich "Rotation", bzw steht oben System.Windows.Forms.TextBox, wobei das bei der anderen auch steht. Was meinst du mit den Wert im debug anschauen?
Vatter schrieb:
Außerdem bin ich skeptisch bei ASC(unverschlüsselt)+Rotation. unverschlüsselt ist ein Array, die Funktion ASC will aber einen String, also z.B. ASC (unverschlüsselt(index)).
"unverschlüsselt" ist doch als Char deklariert?!
get_banned schrieb:
Der Fehler ""unverschlüsselt" ist bereits als "Friend WithEvents unverschlüsselt As System.Windows.Forms.TextBox" in class deklariert" sagt mir, dass ich "unverschlüsselt" garnicht mehr deklarieren muss, weil es durch die Textbox schon automatisch deklariert ist?
? -
Ich habe so meine Zweifel, ob du dich wirklich ernsthaft mit Grundlagen auseinandersetzt...
1. Wenn ich solchen Nonsens schreibewird das sehr wohl unterstrichen, außer deine Textbox heißt wirklich nur "Textbox", was aber ein blöder Name ist. Den Namen deiner Textbox bekommst du raus, indem du sie im Designer anklickst und im Eigenschaftenfenster die Kopfzeibe betrachtest. Da steht dann fettgedruckt z.B. Textbox1. Außerdem gehört die Zuweisung des Rotationswertes nicht da oben hin sondern in das Event, bei dem du die Eintragung des wertes beendet hast (Button-Klick oder TextChanged). Da oben bei den globalen Deklrationen wird deine Form noch iitialisiert und die textbox is noch leer (grundlegende grundlagen)
2. Debug heißt, du setzt haltepunkte in deinem Code (rechte Maustaste>Haltepunkt) Wenn dein Prog da ankommt hält es an und dun kanst durch drüberhalten der Maus deine Variablen betrachten und zur Überwachung anzeigen lassen. (auch grundlegende Grundlagen)
3. Deine Variable unverschlüsselt ist kein Char sondern ein Char() (Array) (auch grundlegende Grundlagen)
Seit 26.Mai 2012 Oppa! -
Vatter schrieb:
indem du sie im Designer anklickst und im Eigenschaftenfenster die Kopfzeibe betrachtest.
Da steht fett Rotation -
Habe das Buch jetzt zum 2 mal gelesen...
Quellcode
- Option Strict On
- Public Class Form1
- Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
- Dim Rotation As Integer = TextBox.Text() <=='"Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis." Das heißt?
- Dim Zahl As Integer = 0 <=='Das hieß doch das "Zahl" >=0 ist?
- Dim Lösung As Integer = caesar(Rotation, Zahl)
- End Sub
- Function caesar(ByVal rotation As Integer, ByVal Zahl As Integer) As Integer
- Dim Lösung As Integer = 0
- Dim unverschlüsselt As String() = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
- If Asc(unverschlüsselt) >= 65 And Asc(unverschlüsselt) <= 90 Then <=='Hier immer der Fehler "Fehler bei der Überladungsauflösung, da keine zugreifbare "Asc" mit diesen Argumenten aufgerufen werden kann:
- 'Public Function Asc(String As String) As Integer': Der Wert vom Typ "1-dimensionales Array von String" kann nicht in "String" konvertiert werden.
- 'Public Function Asc(String As Char) As Integer': Der Wert vom Typ "1-dimensionales Array von String" kann nicht in "Char" konvertiert werden." Wie kann ich das umgehen?
- Zahl = Asc(unverschlüsselt) + rotation
- End If
- If Asc(unverschlüsselt) >= 97 And Asc(unverschlüsselt) <= 122 Then
- Zahl = Asc(unverschlüsselt) + rotation
- End If
- If Zahl >= 65 And Zahl <= 90 Then
- Zahl = Lösung
- End If
- If Zahl >= 97 And Zahl <= 122 Then
- Zahl = Lösung
- End If
- If Zahl > 90 Then
- Lösung = Zahl - 90 + 64
- End If
- If Zahl > 122 Then
- Lösung = Zahl - 122 + 96
- End If
- MsgBox(Chr(Lösung))
- End Function
- End Class
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „get_banned“ ()
-
get_banned schrieb:
Da steht fett RotationUnd zum 2.mal: Die Zuweisung gehört da NICHT hin. Das gehört in eine separate Sub oder ein Event.(Sry, ha die Sub glatt übersehen .
Auch das "unverschlüsselt KEIN Char ist, sondern ein Char-Array, hast du noch nicht umgesetzt.
Und lies das Buch ruhig noch ein par mal, bisdir solche simplen Sachen klar sind.
Edit: Deine Fehlermeldungen bestätigen das, was ich hier oben geschrieben habe.
Und Zahl ist nicht > 0. Du weist ihr doch die 0 zu...
Und wo übergibst du dein zu verschlüsselndes Zeichen an die Funktion? Das mußt du doch in deinem Array suchen und dann den entsprechenden Index für ASC(unverschlüsselt(Index))+Rotation verwenden. Dann wird ein Schuh draus.
Ich glaub, ich gebs auf....Seit 26.Mai 2012 Oppa!Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Vatter“ ()
-
ich kann Vatter nur zustimmen.
Ok, es geht die Funktion in einen Sub zu schließen, aber hier hat es keinen großen NutzenGruß Mangafreak
-
Quellcode
- Option Strict On
- Public Class Form1
- Dim Rotation As Integer
- Dim Zahl As Integer
- Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
- Dim Rotation As Integer = CInt(TBRotation.Text)
- Dim Zahl As Integer = 0
- Dim Lösung As Integer = caesar(Rotation, Zahl)
- MsgBox(Chr(Lösung))
- End Sub
- Function caesar(ByVal rotation As Integer, ByVal Zahl As Integer) As Integer
- Dim Lösung As Integer
- Dim unverschlüsselt As String() = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
- If Asc(unverschlüsselt(25)) >= 65 And Asc(unverschlüsselt(25)) <= 90 Then
- Zahl = Asc(unverschlüsselt(25)) + rotation
- End If
- If Asc(unverschlüsselt(25)) >= 97 And Asc(unverschlüsselt(25)) <= 122 Then
- Zahl = Asc(unverschlüsselt(25)) + rotation
- End If
- If Zahl >= 65 And Zahl <= 90 Then
- Zahl = Lösung
- End If
- If Zahl >= 97 And Zahl <= 122 Then
- Zahl = Lösung
- End If
- If Zahl > 90 Then
- Lösung = Zahl - 90 + 64
- End If
- If Zahl > 122 Then
- Lösung = Zahl - 122 + 96
- End If
- Return Lösung
- End Function
- End Class
Es mag unglaublich klingen, aber es funktioniert (teilweiße). Z.B. aus "a" wird mit der Rotation "5" ein "f". Die Probleme sind noch, das bei einem Wort eben nur der erste Buchstabe verschlüsselt wird, aus verschlüsselten Großbuchstaben Kleinbuchstaben werden und wenn man zB "a" um "34" verschiebt wird ein "," daraus, also der ganze ASCII-Code wird verwendet und nicht nur die Buchstaben...
Falls ihr Ideen habt, dürft ihr sie gerne nennen -
Du solltest vlt mit irgendwas einfacherem anfangen?
Wenn man das System verstanden hat, sieht es in etwa so aus:
VB.NET-Quellcode
- Private Function Rot(ByVal s As String, ByVal r As Integer) As String
- ' Das sind alle "erlaubten" Zeichen in s!
- Dim chars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "
- ' lokale Vars zum zwischenspeichern
- Dim c As Integer
- Dim sb As New System.Text.StringBuilder
- ' r>0 = verschlüsseln, r<0 = entschlüsseln
- If r < 0 Then r = r + chars.Length
- For i = 0 To s.Length - 1
- ' Suche die Position des Zeichens in s in chars
- c = chars.IndexOf(s(i))
- ' Erhöhe c um r und falls zu groß (> länge von chars), dann abschneiden
- c = (c + r) Mod chars.Length
- ' Ergebnis in den Stringbuilder
- sb.Append(chars(c))
- Next
- Return sb.ToString
- End Function
Im Prinzip suchst du nur die IndexPosition deines Zeichens im Satz der erlaubten Zeichen, dann erhöhst du diese IndexPosition um deinen Rotationsfaktor und nimmst dann einfach den Buchstaben an dieser Stelle. Um das ganze rückgängig zu machen, nimmst du halt die passende negative Rotation, wobei du halt nur aufpassen musst, dass du ja leicht "vor" die erste Zeichenposition rutscht. Deswegen wird der rotFaktor halt einfach passend vergrößert, so dass wir wieder im positiven Bereich arbeiten.
"chars" muss alle GÜLTIGEN Zeichen enthalten. Im Zweifel anpassen und den String VORHER prüfen, dass er keine ungültigen Zeichen enthält. Oder halt in der Funktion abfragen ob "c" >=0 ist (-1 heißt Zeichen nicht gefunden) und nur dann mit diesem Zeichen weiterarbeiten. -
Vllt kannst du ja mit folgendem etwas anfangen get_banned
VB.NET-Quellcode
- Private Sub cmdverschlüsseln_Click()
- Dim text$
- text = txttext.text
- txtverschlüsselt.text = encode(text)
- txttext.text = decode(encode(text))
- End Sub
- Function encode(str As String)
- Dim str_crypt$
- Dim i%
- Dim verschiebung As Integer
- verschiebung = txtverschiebung.text
- For i = 1 To Len(str)
- str_crypt = str_crypt & Chr(Asc(Mid(str, i, 1)) + verschiebung)
- Next i
- encode = str_crypt
- End Function
- Function decode(str_crypt As String)
- Dim str$
- Dim i%
- Dim verschiebung
- verschiebung = txtverschiebung.text
- For i = 1 To Len(str_crypt)
- str = str & Chr(Asc(Mid(str_crypt, i, 1)) - verschiebung)
- Next i
- decode = str
- End Function
mfg paulkoch95"yippieh! it compiles - ship it!" -
paulkoch95 schrieb:
Vllt kannst du ja mit folgendem etwas anfangen get_banned
Ein Schredder könnte was damit anfangen. Oder ggfs ne Apotheke, falls mal ein Brechmittel verlangt wird.
HALLO?
Dein Code ist zwar "nur" komplett vb6 style, aber selbst da wäre er noch gruselig! Abgesehen davon funktioniert er noch nicht mal (immer).
BTW: Extreme rotating
VB.NET-Quellcode
We call it a EINZEILERDieser Beitrag wurde bereits 2 mal editiert, zuletzt von „picoflop“ ()
-
Ähnliche Themen
-
Fortrackz - - Sonstige Problemstellungen
-
hundehausen - - Sonstige Problemstellungen
-
8 Benutzer haben hier geschrieben
- Gast (103)
- Mangafreak1995 (24)
- Vatter (7)
- jvbsl (7)
- Mono (2)
- paulkoch95 (1)
- EiPott (1)
- Eierlein (1)