# Java zweidimensionale Verschlüsserung



## maxemann (17. Dez 2022)

Hallo Leute,

Ich soll ein Programm erstellen, wo ich eine Textdatei in eine Matrix packe und diese dann verschlüsselt wieder hinaus bekomme, ich komme mit meinem Coder aber leider nicht weiter, da zum einem ich nicht weiß wie meine Matrix automatisch aufgefüllt wird und es fehlt noch das der verschlüsselte Satz wieder ausgegeben wird.

Ich hoffe ihr könnt mir helfen


----------



## mihe7 (17. Dez 2022)

Erstmal für alle anderen der relevante Code aus dem Zip in Code-Tags (@maxemann im Editor auf </> klicken -> dort Code einfügen):

```
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.Locale;
public class Main extends JFrame implements ActionListener {
    private JPanel mainpanel;           //panel
    private JScrollPane scrollPane;     //Scroll Bars für das TextArea
    private JTextArea textReader;       //TextArea
    private JButton buttonReader;
    private JButton buttonSaver;
    private JButton resetButton;
    private JButton textmanipulationButton;
    private String text;
    private String filesave;
    public static void main(String[] args) {
        new Main();
    }   //Start der Main
    Main(){
        this.setContentPane(mainpanel);

        scrollPane.setViewportView(textReader);     //ScrollPane wird mit dem textReader verknüpft
        buttonReader.setFocusable(false);           //optische Anpassung
        buttonReader.addActionListener(this);    //ActionLister für Read Button erstellen
        textmanipulationButton.setFocusable(false);
        textmanipulationButton.addActionListener(this);
        buttonSaver.setFocusable(false);
        buttonSaver.addActionListener(this);
        resetButton.setFocusable(false);
        resetButton.addActionListener(this);
        this.setBounds(650,200,600,600);    //Position und Größe festlegen
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);        //Kontrolliertes Programmende
        this.setVisible(true);                               //GUI sichtbar machen
    }
    @Override
    public void actionPerformed(ActionEvent e) {            //Aktionen der Benutzersteuerung werden festgelegt
        if(e.getSource() == buttonReader) {                 //welcher Button wurde gedrückt
            JFileChooser chooser = new JFileChooser();      //Fenster zum Öffnen von Dateien wird implementiert
            chooser.showOpenDialog(null);            //Fenster wird geöffnet
            File file = chooser.getSelectedFile();         //String filename = file.getAbsolutePath();
            filesave = file.getAbsolutePath();             //überträgt den Pfad in eine String-Variable
            try {                                          //Vorgeschriebenes try...catch
                BufferedReader br = new BufferedReader(new FileReader(file));      //Öffnen und Einlesen der Datei
                textReader.read(br, null);            //schreiben des Dateiinhaltes in den textReader
                textReader.append("\n");
                br.close();                                //Datei muss geschlossen werden
                //textReader.requestFocus();
            }
            catch (Exception exception) {
                JOptionPane.showMessageDialog(null, exception);
            }
        }
        if(e.getSource() == textmanipulationButton) {
            text = textReader.getText();
            text = text.replaceAll("[ö,Ö]","oe");
           // textReader.append(text+"\n");
            text = text.replaceAll("[ü,Ü]","ue");
            //textReader.append(text+"\n");
            text = text.replaceAll("[ä,Ä]","ae");
           // textReader.append(text+"\n");
            text = text.replaceAll("ß","ss");
            //textReader.append(text+"\n");
            text = text.replaceAll(" ","");
            //textReader.append(text+"\n");
           // text = text.toUpperCase(Locale.ROOT);
           // textReader.append(text+"\n");
           // text = text.replaceAll("[^A-Z]","");
            text = text.replaceAll("[^A-Z,a-z]","");
           // textReader.append(text+"\n");
            text = text.toUpperCase(Locale.ROOT);
            textReader.append(text+"\n");
           char [][] matrix = new char[5][5];
           int length =  text.length();
           for(int y = 0; y < 5; y++) {
               for(int x = 0; x < 5; x++)
               {
                   int Index = x + y*5;
                   matrix[x][y] = text.charAt(Index);
                   System.out.print(matrix[x][y] + " ");
               };
               System.out.print("\n");
           }
        }
    //matrix new array
        if(e.getSource() == buttonSaver){
            try{
                BufferedWriter bw = new BufferedWriter(new FileWriter(filesave));
                text = textReader.getText();
        bw.write(textReader.getText());
                bw.close();
                JOptionPane.showMessageDialog(null, "File successful saved");
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, ex);
            }
        }
        if(e.getSource() == resetButton){
            textReader.setText("");
            filesave = "";
        }

    }


}

//[^0-9] = take everything except from 0 to 9
```

Bzgl. Deiner Fragen müsstest Du etwas konkreter werden, zumal Du ja schon eine 5x5-Matrix ausfüllst.


----------



## osion (18. Dez 2022)

Hier ist ein Beispiel, wie du eine Textdatei in eine Matrix packen und diese dann verschlüsseln kannst:

```
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        String[][] matrix = new String[5][5];  // Erstelle eine 5x5-Matrix
        String text = "";  // Lege eine Variable für den Text an

        // Lies den Text aus der Datei ein und speichere ihn in der Variable "text"
        try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                text += line;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Packe den Text in die Matrix
        int row = 0;
        int col = 0;
        for (int i = 0; i < text.length(); i++) {
            matrix[row][col] = String.valueOf(text.charAt(i));  // Füge den Buchstaben an der aktuellen Position in die Matrix ein
            col++;  // Erhöhe die Spalte um 1
            if (col == 5) {  // Wenn die Spalte den Wert 5 hat, gehe zur nächsten Zeile
                col = 0;
                row++;
            }
        }

        // Fülle die restlichen Felder der Matrix mit X auf
        for (int i = row; i < matrix.length; i++) {
            for (int j = col; j < matrix[0].length; j++) {
                matrix[i][j] = "X";
            }
            col = 0;  // Setze die Spalte wieder auf 0, wenn die nächste Zeile erreicht wurde
        }

        // Verschlüssele die Matrix
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                char c = matrix[i][j].charAt(0);  // Hole den Buchstaben an der aktuellen Position
                c = (char) (c + 1);  // Verschiebe ihn um 1 nach vorne
                matrix[i][j] = String.valueOf(c);  // Speichere den verschlüsselten Buchstaben wieder in der Matrix
            }
        }

        // Gebe den verschlüsselten Text wieder aus
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                System.out.print(matrix[i][j]);
            }
        }
    }
}
```


----------



## maxemann (18. Dez 2022)

Danke für deine Antwort.

Ich sollte in die Matrix ein Beispielsatz von "Das Wetter ist schoen" und da bleiben zwei stellen in der Matrix über und diese soll mit random Buchstaben aufgefüllt werden.


----------



## mihe7 (18. Dez 2022)

Du hast einen Index und Du weißt wie lange der Text ist. Wenn der Index größer oder gleich der Textlänge ist, steht kein Buchstabe aus dem Text mehr zur Verfügung. In dem Fall nimmst Du eben einen zufälligen anderen.


----------



## Blender3D (18. Dez 2022)

maxemann hat gesagt.:


> Ich soll ein Programm erstellen, wo ich eine Textdatei in eine Matrix packe und diese dann verschlüsselt wieder hinaus bekomme, ich komme mit meinem Coder aber leider nicht weiter, da zum einem ich nicht weiß wie meine Matrix automatisch aufgefüllt wird und es fehlt noch das der verschlüsselte Satz wieder ausgegeben wird.


Du scheinst vor allem, Probleme mit der GUI zu haben.
Hier eine lauffähige GUI. Du musst dich damit nur mehr auf die  Funktionalität konzentrieren.

```
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextArea;

@SuppressWarnings("serial")
public class ChiperPanel extends JPanel implements ActionListener {
    private final static int LOAD = 0;
    private final static int SAVE = 1;
    private final static int RESET = 2;
    private final static int CHIP = 3;
    private static final String[] btnName = { "load", "save", "reset", "chip" };
    private JTextArea txtInput = new JTextArea();

    public ChiperPanel(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        create(width, height);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        if (cmd.equals(btnName[LOAD]))
            loadText();
        if (cmd.equals(btnName[SAVE]))
            saveText();
        if (cmd.equals(btnName[RESET]))
            txtInput.setText("");
        if (cmd.equals(btnName[CHIP]))
            chipText();
    }

    private void create(int width, int height) {
        int off = width / 20;
        int txtWidth = width - 2 * off;
        int txtHeight = 9 * height / 10;
        txtInput.setPreferredSize(new Dimension(txtWidth, txtHeight));
        txtInput.setFont(new Font("Courier", Font.BOLD, 20));
        add(txtInput);
        for (int i = 0; i < btnName.length; i++) {
            JButton b = new JButton(btnName[i]);
            b.setFocusable(false);
            add(b);
            b.addActionListener(this);
        }
    }

    private void chipText() {// TODO
        System.out.println("chip");
    }

    private void loadText() {// TODO
        System.out.println("load");
    }

    private void saveText() {// TODO
        System.out.println("save");
    }

}
```


----------



## maxemann (18. Dez 2022)

Danke für eure Hilfe, aber ich habe noch eine Frage und zwar soll ich jetzt von so:
D A S W E 
T T E R I 
S T H E U 
T E S C H 
O E N X X

es so ausgeben, das D T T S O A T T E E usw. rauskommt


----------

