Vigenere Cipher Bug

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Vigenere Cipher Bug

    Hey,

    Schreibe grade aus Spaß ein paar der alten Verschlüsselungs Cipher. Habe gerade Vigenere implementiert, mit Groß-Kleinschreibung Support.
    Das klappt auch, sofern der Text keine Spaces bzw andere Sonderzeichen enthält. Ich kriegs einfach nicht gebacken bei einem Space den KeyIndex nicht zu erhöhen ...
    Was mach ich falsch?

    C-Quellcode

    1. public string Encipher(string data)
    2. {
    3. var keyIndex = 0;
    4. var characters = data.ToCharArray();
    5. for (int i = 0; i < characters.Length; i++)
    6. {
    7. if (characters[i] >= 65 && characters[i] <= 90 || characters[i] >= 97 && characters[i] <= 122)
    8. keyIndex = i % _key.Length;
    9. if (characters[i] >= 65 && characters[i] <= 90)
    10. characters[i] = (char) ((characters[i] - 65 + Shift(_key[keyIndex])) % 26 + 65);
    11. else if (characters[i] >= 97 && characters[i] <= 122)
    12. characters[i] = (char) ((characters[i] - 97 + Shift(_key[keyIndex])) % 26 + 97);
    13. }
    14. return new string(characters);
    15. }
    16. private int Shift(byte c)
    17. {
    18. if (c >= 65 && c <= 90)
    19. return c - 65;
    20. if (c >= 97 && c <= 122)
    21. return c - 97;
    22. throw new ArgumentOutOfRangeException(nameof(c));
    23. }


    InText: The quick brown fox jumps over the lazy dog!
    InKey: BananaZ
    ExpectedOut: Uhr qhibl beojn epx wuzpr pvrr ghd mamy qof!
    MyOutput: Uhr duhdk beovo sok ivmcs oufr tue mamy dnh!

    Nach dem Space stimmts nicht mehr da der KeyIndex weiter hochläuft ..
    C# Developer
    Learning C++
    @Rikudo Um das nachzuvollziehen, müstest Du mal das _key-Array posten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Rikudo Genau das meinte ich.
    Ruf mal Encipher(" ") auf und verfolge, was da mit dem Leerzeichen (nicht) passiert.
    Das wird einfach nirgendwo abgefragt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Wenn ich ein Space mit einer Verschiebung verschlüssele bekomme ich ein Space zurück. So solls auch sein.
    Nur der KeyIndex darf bei sonderzeichen nicht verändert werden. Ich blick nicht ganz wieso das nicht hinhaut.
    C# Developer
    Learning C++

    Rikudo schrieb:

    Nur der KeyIndex darf bei sonderzeichen nicht verändert werden.
    Das tut er doch gar nicht.
    Rufe Encipher() mit diesem Text auf: txt = " .:;!?"; und setz in die Zeile

    C#-Quellcode

    1. keyIndex = i % _key.Length;
    einen Haltepunkt.
    Kann es sein, dass Dein ExpectedOut falsch ist?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Das ExpectedOut is korrekt. Wenn ich: Abc def! als input Text wähle, und mein key abc ist dann sollte der Output eigentlich Ace dfh! sein. (Da Verschiebung a=0, b=1, c=2 ... usw ist)
    Stattdessen bekomme ich aber Ace egf!. Mein ExpectedOut ist also nicht das Problem. Bei deinem Beispiel bekomm ich den Input wieder zurück, das passt also.
    Das Problem ist nach wie vor wenn nach dem Sonderzeichen (z.B. Leerzeichen) ein normales Zeichen kommt..
    C# Developer
    Learning C++
    @Rikudo Wenn Du das schrittweise durcharbeitest, sollte doch klar werden, was da bzw. nicht passiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dein keyIndex ist direkt von i abhängig. Selbst wenn Du keyIndex für das Leerzeichen nicht berechnest, überschreibst du ihn im nächsten Schritt trotzdem wieder mit i % keyLength. i ist aber schon 2 Schritte weiter. Stattdessen brauchst du keyIndex = (i-1) % keyLength (für das erste Leerzeichen). Lösung: Zähle keyIndex unabhängig von i.
    Gruß
    hal2000