Cäsar Verschlüsselung

  • VB.NET

Es gibt 145 Antworten in diesem Thema. Der letzte Beitrag () ist von get_banned.

    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 :rolleyes: ) und übergibst ihn als Parameter bei Funktionsaufruf:

    VB.NET-Quellcode

    1. caesar(rotation, text, usw...)
    2. Function caesar(ByVal rotation As String, ByVal text As String, usw...)
    3. 'hier kannst du die variablen dann ohne deklaration verwenden
    4. '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)))
    5. End Function

    Quellcode

    1. Public Class Form1
    2. 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"}
    3. Dim Rotation As Integer = TextBox.Text()
    4. Dim Lösung As Integer
    5. Dim Zahl As Integer
    6. Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
    7. Function Public Class (ByVal rotation As Integer, ByVal Lösung As Integer, ByVal Zahl As Integer)
    8. If Asc(unverschlüsselt) >= 65 And Asc(unverschlüsselt) <= 90 Then
    9. Zahl = Asc(unverschlüsselt) + Rotation
    10. End If
    11. If Asc(unverschlüsselt) >= 97 And Asc(unverschlüsselt) <= 122 Then
    12. Zahl = Asc(unverschlüsselt) + Rotation
    13. End If
    14. If Zahl >= 65 And Zahl <= 90 Then
    15. Zahl = Lösung
    16. End If
    17. If Zahl >= 97 And Zahl <= 122 Then
    18. Zahl = Lösung
    19. End If
    20. If Zahl > 90 Then
    21. Lösung = Zahl - 90 + 64
    22. End If
    23. If Zahl > 122 Then
    24. Lösung = Zahl - 122 + 96
    25. End If
    26. MsgBox(Chr(Lösung))
    27. End Function
    28. 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

    1. Public Class/Module/Enum/Structure/Interface
    2. ' Beispiel ist ohne Modifier bei den Functions/Subs. Die kannst du natürlich noch hinzufügen
    3. Sub SubName(ByVal Params As Object)
    4. End Sub
    5. Function FuncName() As Object
    6. Return New Object() ' natürlich irgendetwas logisches mit Wert zurückgeben :D
    7. End Function
    8. End Class/Module/Enum/Structure/Interface
    9. ' das hier noch ein Namespace ist für dich noch irrelevant
    So in etwa sollte es aussehn:

    VB.NET-Quellcode

    1. Public Class Form1
    2. 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"}
    3. Dim Rotation As Integer = TextBox.Text()
    4. Dim Zahl As Integer
    5. Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
    6. Dim Lösung As Integer = caesar(Rotation, Zahl)
    7. MsgBox(Lösung)
    8. ODER!:
    9. MsgBox(caesar(Roatation, Zahl) ' so kannst du dir die variable Lösung sparen, wenn du diese später nicht noch brauchst...
    10. End Sub
    11. Function caesar (ByVal rotation As Integer, ByVal Zahl As Integer) As Integer 'hier gibst du an, wie der rückgabewert deiner funktion ist
    12. Dim Lösung As Integer = 0
    13. If Asc(unverschlüsselt) >= 65 And Asc(unverschlüsselt) <= 90 Then
    14. Zahl = Asc(unverschlüsselt) + Rotation
    15. End If
    16. If Asc(unverschlüsselt) >= 97 And Asc(unverschlüsselt) <= 122 Then
    17. Zahl = Asc(unverschlüsselt) + Rotation
    18. End If
    19. If Zahl >= 65 And Zahl <= 90 Then
    20. Zahl = Lösung
    21. End If
    22. If Zahl >= 97 And Zahl <= 122 Then
    23. Zahl = Lösung
    24. End If
    25. If Zahl > 90 Then
    26. Lösung = Zahl - 90 + 64
    27. End If
    28. If Zahl > 122 Then
    29. Lösung = Zahl - 122 + 96
    30. End If
    31. Return Lösung
    32. End Function
    33. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „buettner123“ ()

    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?

    Mangafreak1995 schrieb:

    du kannst Functionen und Subs nicht verschachteln

    Klar kann man

    VB.NET-Quellcode

    1. Private Sub foo()
    2. Dim IsOdd As New Func(Of Integer, Boolean)(Function(i As Integer)
    3. If i Mod 2 = 0 Then
    4. Return False
    5. Else
    6. Return True
    7. End If
    8. End Function)
    9. End Sub


    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

    1. Public Class Form1
    2. 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"}
    3. Dim Rotation As Integer = TextBox.Text()
    4. Dim Zahl As Integer
    5. Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
    6. Dim Lösung As Integer = caesar(Rotation, Zahl)
    7. MsgBox(Lösung)
    8. End Sub
    9. Function caesar(ByVal rotation As Integer, ByVal Zahl As Integer) As Integer 'hier gibst du an, wie der rückgabewert deiner funktion ist
    10. Dim Lösung As Integer = 0
    11. If Asc(unverschlüsselt) >= 65 And Asc(unverschlüsselt) <= 90 Then
    12. Zahl = Asc(unverschlüsselt) + rotation
    13. End If
    14. If Asc(unverschlüsselt) >= 97 And Asc(unverschlüsselt) <= 122 Then
    15. Zahl = Asc(unverschlüsselt) + rotation
    16. End If
    17. If Zahl >= 65 And Zahl <= 90 Then
    18. Zahl = Lösung
    19. End If
    20. If Zahl >= 97 And Zahl <= 122 Then
    21. Zahl = Lösung
    22. End If
    23. If Zahl > 90 Then
    24. Lösung = Zahl - 90 + 64
    25. End If
    26. If Zahl > 122 Then
    27. Lösung = Zahl - 122 + 96
    28. End If
    29. Return Lösung
    30. End Function
    31. 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. :D
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    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 schreibe

    VB.NET-Quellcode

    1. Dim a As Integer = TextBox.Text
    wird 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)

    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Habe das Buch jetzt zum 2 mal gelesen...

    Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
    4. Dim Rotation As Integer = TextBox.Text() <=='"Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis." Das heißt?
    5. Dim Zahl As Integer = 0 <=='Das hieß doch das "Zahl" >=0 ist?
    6. Dim Lösung As Integer = caesar(Rotation, Zahl)
    7. End Sub
    8. Function caesar(ByVal rotation As Integer, ByVal Zahl As Integer) As Integer
    9. Dim Lösung As Integer = 0
    10. 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"}
    11. 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:
    12. 'Public Function Asc(String As String) As Integer': Der Wert vom Typ "1-dimensionales Array von String" kann nicht in "String" konvertiert werden.
    13. '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?
    14. Zahl = Asc(unverschlüsselt) + rotation
    15. End If
    16. If Asc(unverschlüsselt) >= 97 And Asc(unverschlüsselt) <= 122 Then
    17. Zahl = Asc(unverschlüsselt) + rotation
    18. End If
    19. If Zahl >= 65 And Zahl <= 90 Then
    20. Zahl = Lösung
    21. End If
    22. If Zahl >= 97 And Zahl <= 122 Then
    23. Zahl = Lösung
    24. End If
    25. If Zahl > 90 Then
    26. Lösung = Zahl - 90 + 64
    27. End If
    28. If Zahl > 122 Then
    29. Lösung = Zahl - 122 + 96
    30. End If
    31. MsgBox(Chr(Lösung))
    32. End Function
    33. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „get_banned“ ()

    get_banned schrieb:

    Da steht fett Rotation
    Dann schreib gefälligst auch Rotation = Rotation.text, wobei die dppelte Namensvergabe sch***** ist. Nenn die textbox wenigstens TBRotation oder so, damit du die Textbox von der Integervariable unterscheiden kannst. Und 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 :D .
    Auch das "unverschlüsselt KEIN Char ist, sondern ein Char-Array, hast du noch nicht umgesetzt. :thumbdown:

    Und lies das Buch ruhig noch ein par mal, bisdir solche simplen Sachen klar sind. 8|

    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.... :S
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

    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 Nutzen :D

    Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim Rotation As Integer
    4. Dim Zahl As Integer
    5. Private Sub Verschlüsseln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Verschlüsseln.Click
    6. Dim Rotation As Integer = CInt(TBRotation.Text)
    7. Dim Zahl As Integer = 0
    8. Dim Lösung As Integer = caesar(Rotation, Zahl)
    9. MsgBox(Chr(Lösung))
    10. End Sub
    11. Function caesar(ByVal rotation As Integer, ByVal Zahl As Integer) As Integer
    12. Dim Lösung As Integer
    13. 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"}
    14. If Asc(unverschlüsselt(25)) >= 65 And Asc(unverschlüsselt(25)) <= 90 Then
    15. Zahl = Asc(unverschlüsselt(25)) + rotation
    16. End If
    17. If Asc(unverschlüsselt(25)) >= 97 And Asc(unverschlüsselt(25)) <= 122 Then
    18. Zahl = Asc(unverschlüsselt(25)) + rotation
    19. End If
    20. If Zahl >= 65 And Zahl <= 90 Then
    21. Zahl = Lösung
    22. End If
    23. If Zahl >= 97 And Zahl <= 122 Then
    24. Zahl = Lösung
    25. End If
    26. If Zahl > 90 Then
    27. Lösung = Zahl - 90 + 64
    28. End If
    29. If Zahl > 122 Then
    30. Lösung = Zahl - 122 + 96
    31. End If
    32. Return Lösung
    33. End Function
    34. End Class


    :thumbsup: 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

    1. Private Function Rot(ByVal s As String, ByVal r As Integer) As String
    2. ' Das sind alle "erlaubten" Zeichen in s!
    3. Dim chars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "
    4. ' lokale Vars zum zwischenspeichern
    5. Dim c As Integer
    6. Dim sb As New System.Text.StringBuilder
    7. ' r>0 = verschlüsseln, r<0 = entschlüsseln
    8. If r < 0 Then r = r + chars.Length
    9. For i = 0 To s.Length - 1
    10. ' Suche die Position des Zeichens in s in chars
    11. c = chars.IndexOf(s(i))
    12. ' Erhöhe c um r und falls zu groß (> länge von chars), dann abschneiden
    13. c = (c + r) Mod chars.Length
    14. ' Ergebnis in den Stringbuilder
    15. sb.Append(chars(c))
    16. Next
    17. Return sb.ToString
    18. 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

    1. Private Sub cmdverschlüsseln_Click()
    2. Dim text$
    3. text = txttext.text
    4. txtverschlüsselt.text = encode(text)
    5. txttext.text = decode(encode(text))
    6. End Sub
    7. Function encode(str As String)
    8. Dim str_crypt$
    9. Dim i%
    10. Dim verschiebung As Integer
    11. verschiebung = txtverschiebung.text
    12. For i = 1 To Len(str)
    13. str_crypt = str_crypt & Chr(Asc(Mid(str, i, 1)) + verschiebung)
    14. Next i
    15. encode = str_crypt
    16. End Function
    17. Function decode(str_crypt As String)
    18. Dim str$
    19. Dim i%
    20. Dim verschiebung
    21. verschiebung = txtverschiebung.text
    22. For i = 1 To Len(str_crypt)
    23. str = str & Chr(Asc(Mid(str_crypt, i, 1)) - verschiebung)
    24. Next i
    25. decode = str
    26. 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

    1. Private Const allowed As String = "ABCD"
    2. Private Function RotSingleLine(ByVal s As String, ByVal rotfak As Integer) As String
    3. Return Join((From c As Char In s Where allowed.Contains(c) Select CStr((allowed & allowed)((rotfak Mod allowed.Length) + s.IndexOf(c)))).ToArray, "")
    4. End Function


    We call it a EINZEILER ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „picoflop“ ()