CaesarVerschlüsselung Umlaute

F

FranzFerdinand

Gast
Hallöle,

ich habe mir eine Caesarverschlüsselung gebastelt. Es existieren zwei Textareas links und rechts und in der Mitte gibt man den Schlüssel (bis 128) ein, mit welchem in der ASCII Tabelle verschoben wird.
Es gibt einen Ver- und einen Entschlüsselungsbutton.

So sieht mein Quellcode nun aus:
Java:
package caesar;

import java.awt.Button;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.text.NumberFormatter;

public class Caesarverschluesseln {
	
	private static JFrame frame1 = new JFrame("Caesarverschlüsselung");
	private int frameWidth = 770;
	private int frameHeight = 600;
	private NumberFormat format = NumberFormat.getInstance(); 
	private NumberFormatter formatter = new NumberFormatter(format);
	private Button buttonverschluesseln = new Button("-->");
	private Button buttonentschluesseln = new Button("<--");
	private JFormattedTextField schluesselfeld = new JFormattedTextField(formatter);
	private JTextArea klartext = new JTextArea();
	private JScrollPane klartextScrollPane = new JScrollPane(klartext);
	private JTextArea geheimtext = new JTextArea();
	private JScrollPane geheimtextScrollPane = new JScrollPane(geheimtext);

	private String klartextstring = new String();
	private String geheimtextstring = new String();
	private int schluessel;
	
	public Caesarverschluesseln() {
		frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame1.setSize(frameWidth, frameHeight);
		frame1.setResizable(false);
		Container cp = frame1.getContentPane();
		cp.setLayout(null);
		
		buttonverschluesseln.setBounds(360, frameHeight/2-44, 50, 26);
		buttonverschluesseln.setVisible(true);
		buttonverschluesseln.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				buttonverschluesseln_ActionPerformed(evt);
			}
		});
		cp.add(buttonverschluesseln);
		
		buttonentschluesseln.setBounds(360, frameHeight/2+18, 50, 26);
		buttonentschluesseln.setVisible(true);
		buttonentschluesseln.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				buttonentschluesseln_ActionPerformed(evt);
			}
		});
		cp.add(buttonentschluesseln);
		
		schluesselfeld.setBounds(360, frameHeight/2-13, 50, 26);
		schluesselfeld.setToolTipText("Schlüssel");
		schluesselfeld.setHorizontalAlignment(JTextField.CENTER);
		schluesselfeld.setVisible(true);
		cp.add(schluesselfeld);
		
		klartextScrollPane.setBounds(5, 5, 350, frameHeight-30);
		klartext.setText("Heizölrückstoßabdämpfung");
		klartext.setLineWrap(true);
		klartext.setWrapStyleWord(true);
		klartext.setToolTipText("Klartext");
	    cp.add(klartextScrollPane);
	    geheimtextScrollPane.setBounds(415, 5, 350, frameHeight-30);
	    geheimtext.setLineWrap(true);
	    geheimtext.setWrapStyleWord(true);
	    geheimtext.setToolTipText("Geheimtext");
	    cp.add(geheimtextScrollPane);
	    
	    format.setGroupingUsed(false); 
		formatter.setAllowsInvalid(false);
		frame1.setLocationRelativeTo(null);
		frame1.setVisible(true);
		
	}

	private void buttonverschluesseln_ActionPerformed(ActionEvent evt) {
		klartextstring = klartext.getText();
		char[] verschluesselarr = klartextstring.toCharArray();
		if(schluesseleinlesen() == true) {
			char[] verschluesselarrfertig = verschluesseln(verschluesselarr);
			geheimtextstring = String.valueOf(verschluesselarrfertig);
			geheimtext.setText(geheimtextstring);
		}
	}
	
	private char[] verschluesseln(char[] charArray) {
		char[] cryptArray = new char[charArray.length];
 
        for(int i=0;i<charArray.length;i++) {
        	int verschiebung = (charArray[i] + schluessel)%128;
        	cryptArray[i] = (char)(verschiebung);
        }
        return cryptArray;
	}
	
	private void buttonentschluesseln_ActionPerformed(ActionEvent evt) {
		geheimtextstring = geheimtext.getText();
		char[] entschluesselarr = geheimtextstring.toCharArray();
		if(schluesseleinlesen() == true) {
			char[] entschluesselarrfertig = entschluesseln(entschluesselarr);
			klartextstring = String.valueOf(entschluesselarrfertig);
			klartext.setText(klartextstring);
		}
	}
	
	public char[] entschluesseln(char[] charArray) {
		char[] cryptArray = new char[charArray.length];
        int verschiebung; 
        
        for(int i=0;i<charArray.length;i++) {
        	if(charArray[i] - schluessel < 0) {
        		verschiebung = charArray[i] - schluessel + 128;
        	} else {
        		verschiebung = (charArray[i] - schluessel)%128;
                cryptArray[i] = (char)(verschiebung);
        	}
        }
        return cryptArray;
    }
	
	private boolean schluesseleinlesen() {
		String schluesselstr = schluesselfeld.getText();
		try {
			schluessel = Integer.parseInt(schluesselstr);
			if(schluessel < 0) {
				schluessel = schluessel%128;
				schluessel = 128 - schluessel;
			}
			return true;
		} catch (NumberFormatException ex){
			JOptionPane.showMessageDialog(null, "Dein Schlüssel ist ungültig.\nBitte wähle eine Zahl im Bereich von 1 bis 128.", "Falscher Schlüssel", JOptionPane.PLAIN_MESSAGE);
			return false;
		}
		
	}

	public static void main(String[] args) {
		new Caesarverschluesseln();
	}
}

Es funktioniert relativ spitzenmäßig, aber bei Umlauten macht er Stress.
Als Beispiel habe ich einmal "Heizölrückstoßabdämpfung" eingegeben.
Verschlüsselt mit dem Wert 4 ergibt sich hier: "Lim~zpvgowxscefhhqtjyrk"
Wenn ich genau das wieder mit 4 Entschlüssle kommt das hier heraus:
"Heizvlrcksto_abddmpfung"

Es scheint also zu funktionieren, nur etwaige Sonderzeichen machen Zicken.

Kann mir jemand erklären, wie ich derartige Fälle vorbeugen kann?

Vielen Lieben Dank!
Gruß
Lukas :)
 

Anfänger2011

Bekanntes Mitglied
Du könntest die Umlaute nacheinander testen. Wenn bei den Umlauten alleine und in kombination von verscheidenen Wörtern das selbe Zeichen ausgegeben wird, kannst du mit if-Abfragen und einer angepassten Ausgabe dein Problem lösen.
 
F

FranzFerdinand

Gast
Hallöle und Danke für Deine Antwort,

das kann doch aber kein Zustand sein, dass ich hier für jedes einzelne Sonderzeichen für jeden spezifischen Grad an Verschiebung Sonderbedingungen stelle.

Das ist doch ne ganz normale 128er Tabelle. Kennt da niemand eine Möglichkeit, wie ich das besser lösen könnte?

Gruß
Lukas
 

Dompteur

Top Contributor
Dein Problem ist, dass der Char-Code für die Sonderzeichen größer als 127 ist. In deinem Programm werden alle Zeichen, die den gleichen Modulo 128 Wert haben, auf ein und dassselbe Zeichen abgebildet.

Ich habe dein Beispiel zwar nicht nachvollzogen. Aber anhand deines Beispiels müssten das beispielsweise "v" und"ö" sein. Wenn aber die beiden Zeichen denselben Code ergeben, dann kannst du das beim Entschlüsseln nicht mehr unterscheiden.

Eine Lösung wäre, dass du von 128 auf 256 erlaubte Zeichen gehst.

Ein anderer Ansatz wäre, die Sonderzeichen in den Raum der ersten 128 Zeichen zu legen. Dazu müsstest du entscheiden, welche der ersten 128 Zeichen du nicht brauchst und an deren Stelle legst du die Sonderzeichen.
 
F

FranzFerdinand

Gast
Hallöle,

sorry hat etwas länger mit einer Antwort gedauert, hatte viel zu tun.
Das umbauen der 128 auf 256 bringt leider keine Abhilfe auf die Umlaute. Die verschwinden leider trotzdem und sind nicht rückwandelbar.

Kennt jemand eine gute Idee, wie man Cäsar das mit den Sonderzeichen verklickern kann, ohne dass ich jetzt sowas albernes mache, dass ich für jedes einzelne Zeichen eine Sonderregel einbaue?

Schöne Grüße
Lukas
 

Flown

Administrator
Mitarbeiter
Umlaute können vorher umgewandelt werden: ä -> ae. Dann musst du auch nichts im Code ändern.
 

Dompteur

Top Contributor
Deine "entschluesseln" Methode hat noch einen Fehler.
In den Zeilen 121-126 hast du einen if/else-Block.
Die letzte Zeile des else-Zweigs gehört aus dem else-Zweig raus und hinter das if/else. Genauso wie es die Einrückungsstufe suggeriert. ;-)

Also : "cryptArray = (char)(verschiebung);" muss immer gemacht werden. Nicht nur im else Zweig. Sonst verlierst du einzelne Zeichen.

Verwende bitte auch eine Konstante für 256 und stell sicher, dass du alle Vorkommnisse von 128 damit ersetzt hast.
 
Zuletzt bearbeitet:
F

FranzFerdinand

Gast
Guten Tag,

und vielen Dank euch beiden für eure Antworten!
@Flown: Leider kann ich das so pauschal nicht machen. Ich kenne auch genug Begriffe, wo ae ein ganz normaler Teil des Begriffes ist und nicht gleich in ein ä verwandelt werden soll.
Außerdem würde das ja auch einer Methode gleich kommen, wobei ich jedes Zeichen einzeln behandeln muss.

@Dompteur: Du hast die Lösung! Ich danke Dir vielmals.
Also ich habe alle 6 Stellen, wo 128 steht durch 256 ersetzt.
Außerdem habe ich die von Dir genannten Zeilen hierdurch ersetzt:
Java:
if(charArray[i] - schluessel < 0) {
        		verschiebung = charArray[i] - schluessel + 256;
        	} else {
        		verschiebung = (charArray[i] - schluessel)%256;
        	}
        	cryptArray[i] = (char)(verschiebung);

Da hast Du absolut recht. Es ist manchmal echt ärgerlich, welche Flüchtigkeitsfehler einem passieren! :)
Aber nun funktioniert es. Also ich konnte noch keinen Text finden, der das Programm irgendwie manipuliert.

Wenn jemandem noch eine potentielle Schwachstelle auffällt, sollte er nicht zögern und darf sie mir gerne verraten. :)

Danke!
Gruß
Lukas


Edit:
eine Sache läuft noch nicht.
Das hier:
Java:
if(schluessel < 0) {
				schluessel = schluessel%256;
				schluessel = 256 - schluessel;
			}

Ich wollte erreichen, dass er auch in die negative Richtung verschiebt. Also wenn ich da -4 eingebe, verschiebt er 4 Stellen zurück bzw.252 Stellen nach vorn. Aber darauf reagiert er nicht. Er macht es so, als würde da kein minus stehen. Bei -4 wird aus einem E ein I und nicht ein A.

Edid vom Edit:
Es muss
Java:
256 + schluessel
heißen. Durch das negative Vorzeichen, steht da eh schon ein minus und macht daraus wieder ein Plus. ;)
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
N iText keine Sonderzeichen und Umlaute unter Windows Allgemeine Java-Themen 13
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
L Tess4j Umlaute anzeigen Allgemeine Java-Themen 3
T Umlaute in Eclipse einlesen funktioniert nicht Allgemeine Java-Themen 16
T Input/Output Konsole gibt trotz printf keine Umlaute aus Allgemeine Java-Themen 17
T Umlaute werden falsch gedruckt Allgemeine Java-Themen 2
F Windows Umlaute Allgemeine Java-Themen 15
MiMa Umlaute beim Einlesen von Dateinamen Allgemeine Java-Themen 12
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
B Zip umlaute Allgemeine Java-Themen 8
S jar-Datei stellt Umlaute nicht dar Allgemeine Java-Themen 6
K Javamail:Probleme mit der Darstellung von Umlaute in Subject Allgemeine Java-Themen 15
S Umlaute machen probleme Allgemeine Java-Themen 3
E HTML File mit Umlaute einlesen Allgemeine Java-Themen 8
R Base64_decode Umlaute Problem. Allgemeine Java-Themen 8
J Umlaute bei Commons-Fileupload Allgemeine Java-Themen 3
T Wie konvertiere ich Umlaute (ä -> ae) ? Allgemeine Java-Themen 7
J Umlaute in regulären Ausdrücken Allgemeine Java-Themen 3
kodela replace und die Umlaute Allgemeine Java-Themen 10
D zeichenerkennung für umlaute bei eingabe Allgemeine Java-Themen 4
S Mac OS JRE verhunst Umlaute Allgemeine Java-Themen 6
G Datei einlesen: Umlaute sind Fragezeichen Allgemeine Java-Themen 23
cover1012 Umlaute in id3 Tags Allgemeine Java-Themen 2
F Umlaute: E-Mail per JavaMail und Textfile Allgemeine Java-Themen 5
J JAR und Umlaute Allgemeine Java-Themen 4
B Umlaute über Konsoloe ein- und ausgeben Allgemeine Java-Themen 5
G Windows Shell Umlaute Problem Allgemeine Java-Themen 19
W Umlaute umwandeln bekomme nur Leerzeichen raus. Allgemeine Java-Themen 11
E Umlaute: FileWriter vs. FileOutputStream Allgemeine Java-Themen 3
W Umlaute in Dateien und Verzeichnissen. Bekomme Fehler Allgemeine Java-Themen 5
M Umlaute richtig dastellen? Allgemeine Java-Themen 4
X Umlaute im JAR-File Allgemeine Java-Themen 4
B Umlaute-Problem bei Plattform-Wechsel Allgemeine Java-Themen 9
C Umlaute mysql Allgemeine Java-Themen 3
F Umlaute in Text . Allgemeine Java-Themen 7
V Umlaute, sonderzeichen beim HTMLEditiorKit Allgemeine Java-Themen 2
O Probleme mit Umlaute Allgemeine Java-Themen 12
B html umlaute decoden Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben