Entschlüsselungsproblem (Caesar)

Status
Nicht offen für weitere Antworten.
M

Moonflyer

Gast
Hey Leute,

im Studium programmieren wir gerade eine Caesar Verschlüsselung.

Hier nochmal kurz die Aufgabe:
Das Verfahren:
Ein Zeichen des Klartexts wird durch Verschieben um einen Wert a im Alphabet verschlüsselt. Das
Verschieben der Buchstaben erfolgt dabei zyklisch.
Beispiel:
Für a=3 folgt die Verschlüsselung dieser Tabelle mit KTA (Klartextalphabet) und GTA
(Geheimtextalphabet):
KTA: 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
GTA: 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
Aus dem Klartext ZIEL wird das Wort CLHO.

Das Verschlüsseln klappt prima, auch über die "Grenzen" hinaus. (Z wird zu C, Y zu B...).
Ich betrachte dabei quasi erst einmal die Zeichen, die simpel zu verschieben sind und dann die Zeichen am Ende des Alphabets, die gesondert betrachtet werden müssen.
Code:
 public String verschluessele(String s){

   s = s.toUpperCase();                                    // UPPERCASE
   char[] k = s.toCharArray();                             // Umwandeln in char-Array

   for (int i=0; i<s.length(); i++) {
     char c = s.charAt(i);                                 // Jedes einzelnes char-Element wird angewählt

     if(((int)(c) >= 65) && ((int)(c) <= (90-a))){         // "Normale" Erhöhung des ASCII-Wertes um a
       c = (char)((int)(c) + a);
       k[i] = c;
     }
     else if (((int)(c) >(90-a)) && ((int)(c) <=90)){      // Sonderregel für das Überschreiten der Grenze
       c = (char)(a-(90-(int)(c))+64);
       k[i] = c;
     }
   }
   s = new String(k);
   return s;
 }

Die Entschlüsselung müsste ja eigentlich genauso nur andersrum funktionieren.
Jedoch hab ich ein Problem mit dem "über die Grenze verschieben".
Code:
 public String entschluessele(String s){

   s = s.toUpperCase();                                    // UPPERCASE
   char[] k = s.toCharArray();                             // Umwandeln in char-Array

   for (int i=0; i<s.length(); i++) {
     char c = s.charAt(i);                                 // Jedes einzelnes char-Element wird angewählt

     if(((int)(c) >= (65+a)) && ((int)(c) <= (90))){         // "Normale" Erniedrigung des ASCII-Wertes um a
       c = (char)((int)(c) - a);
       k[i] = c;
     }
     else if (((int)(c) >= 65) && ((int)(c) <(65+a))){      // Sonderregel für das Überschreiten der Grenze
       
>>   c = (char)(a-(65-(int)(c))+90); << HIER KOMM ICH NICHT ZURECHT

       k[i] = c;
     }
   }
   s = new String(k);
   return s;
 }

Ich hab die Stelle markiert, die nicht funktioniert. Irgendwie versagt mein Verstand dabei. Kann sich das bitte einer anschauen ?

Danke :)
 
S

SlaterB

Gast
zunächst mal: kannst du nicht c statt (int) (c) schreiben? scheint mir syntaktisch erlaubt,
wenn nicht, dann definiere dir doch eine Hilfsvariable
int cc = (int) c;

im Moment ist dein Code ja unlesbar..

-----------

Verchlüsseln:
c = (char)((int)(c) + a);
also
c = (char)(c + a);

beim Überlauf:
c = (char)(a-(90-(int)(c))+64);
also
c = (char)(a-(90-c)+64);

das ist unnötig kompliziert geschrieben, mache es lieber so wie oben und subtrahiere 26 für den Überlauf
c = (char)(c + a - 26);

---------

mit diesen Vereinfachungen fällt dir vielleicht auch das Entschlüsseln leichter,

ansonsten: Code weiter vereinfachen,
verschlüssle doch erstmal ein Zeichen statt so vieler auf einmal (for-Schleife fällt weg),
dann nimm für a einen festen Wert, a = 10,

und dann male dir notfalls per Hand auf, was für a, b, c usw. rauskommen soll,
wenn du dann immer noch nicht die Formel siehst, dann kannst du ja fragen,
aber so? versuche es doch lieber selber, sei froh, so ein extrem einfaches Problem zu haben ;)
 
M

Moonflyer

Gast
Danke Slater.

Ich habs dann selbst hingekriegt. Ich war wohl etwas übereifrig in Sachen klammern und Castings :)
 
G

Gelöschtes Mitglied 5909

Gast
man sollte doch auch mit a-z rechnen können?
oder geht des in java nich? in c++ gehts, macht die sache noch ein wenig einfacher und auch lesbarer wie ich finde
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Feststellen, dass Wert zu groß; Caesar Chiffre Java Basics - Anfänger-Themen 3
T Fehler in Caesar-Chiffre Java Basics - Anfänger-Themen 7
N Erste Schritte JFrame Caesar-Verschlüsselung Java Basics - Anfänger-Themen 23
M Caesar Chiffre Java Basics - Anfänger-Themen 3
Y Caesar Verschlüsselung Fehler Java Basics - Anfänger-Themen 4
N Caesar Entschlüsselungsprogramm Java Basics - Anfänger-Themen 10
N Caesar Verschlüsselung Java Basics - Anfänger-Themen 2
J Erste Schritte Caesar - Code Verbesserung Java Basics - Anfänger-Themen 2
K Caesar Verschlüsselng Java Basics - Anfänger-Themen 18
S Caesar Verschlüsselung Start Hilfe Java Basics - Anfänger-Themen 4
H Caesar-Verschlüsselung - Was stimmt nicht? Java Basics - Anfänger-Themen 6
J Caesar Ciphers funktioniert nicht Java Basics - Anfänger-Themen 3
S Caesar-Verschlüsselung Problem/Frage Java Basics - Anfänger-Themen 4
B Textentschlüsselung nach Caesar Java Basics - Anfänger-Themen 3
M Caesar Encrypt+Decrypt Java Basics - Anfänger-Themen 3
K Caesar-chiffre Java Basics - Anfänger-Themen 5
F Nachrichtenverschlüsselung nach Caesar: Java Basics - Anfänger-Themen 4
C weniger code für: caesar + reverse? Java Basics - Anfänger-Themen 8
P Caesar Ver- und Entschlüsselung Java Basics - Anfänger-Themen 1
D Caesar Chiffre Java Basics - Anfänger-Themen 2
L Caesar-Verschlüsselung programmieren Java Basics - Anfänger-Themen 12
G Caesar-Chiffre Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben