Input/Output Caesar-Verschlüsselung

B

blubbrezn

Gast
Hallo Leute,
ich hab dieses Programm für meine Seminararbeit geschrieben (ist nocht nicht ganz fertig!)
aber ich kann Textdateien einlesen verschlüsseln, wieder entschlüsseln und auch speichern
wenn ich aber den eingelesenen Text verschlüssle und dann speichere und später wieder einlese kommt beim entschlüsseln nur wieder ein Zeichen wirrwar heraus.
könnte vllt jemand in einer freien Minute(vllt auch ein paar mehr) drüberschauen? wäre echt super nett

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;



public class ApplicationA extends JFrame {

  /**
   * @param args
   */
  
  private JButton jb1 = new JButton("Öffnen");
  private JButton jb2 = new JButton("Speichern");
  private JButton jb3 = new JButton("Verschlüsseln");
  private JButton jb4 = new JButton("Entschlüsseln");
  private JTextArea jta1 = new JTextArea();
  private JScrollPane jsp1 = new  JScrollPane(jta1);
  private JPasswordField jpf1 = new JPasswordField();
  
  public ApplicationA ()throws Exception{
    super("App");
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    setSize(600,430);
    setLocation(0,0);
    Container cp = getContentPane();
      cp.setLayout(null);
      setResizable(false);
      setVisible(true);
      
      jb1.setBounds(480, 350, 60, 20);
      jb1.setMargin(new Insets(2,2,2,2));
      jb1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
          try{jb1_Action(evt);}catch(Exception e){}
          }});
      cp.add(jb1);
      
      jb2.setBounds(380, 350, 80, 20);
      jb2.setMargin(new Insets(2,2,2,2));
      jb2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
          try{jb2_Action(evt);}catch(Exception e){}
          }});
      cp.add(jb2);
      
      jb3.setBounds(200, 330, 100, 20);
      jb3.setMargin(new Insets(2,2,2,2));
      jb3.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
          try{jb3_Action(evt);}catch(Exception e){}
          }});
      cp.add(jb3);
      jb4.setBounds(200, 370, 100, 20);
      jb4.setMargin(new Insets(2,2,2,2));
      jb4.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
          try{jb4_Action(evt);}catch(Exception e){}
          }});
      cp.add(jb4);
      
      jsp1.setBounds(10,10,500,300);
      cp.add(jsp1);
      
      jpf1.setBounds(20, 350, 150, 20);
      jpf1.setEchoChar('*');
      cp.add(jpf1);
      
  }
  private File chooseFile () {
    JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int returnVal = fc.showOpenDialog(jta1);
        File f;
        if(returnVal == JFileChooser.APPROVE_OPTION){
          f = fc.getSelectedFile();
        }else{f=null;}
        
        return f; 
  }
  private File chooseSaveFile(){
    JFileChooser fc = new JFileChooser();
    //fc.setApproveButtonText("Speichern");
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int returnVal = fc.showSaveDialog(jta1);
        File f;
        if(returnVal == JFileChooser.APPROVE_OPTION){
          f = fc.getSelectedFile();
        }else{f=null;}
        
        return f;
  }
  private String readTXT (File f) throws Exception {
    String text="";
    BufferedReader br= new BufferedReader(new FileReader(f));
    
    String line=br.readLine();
    while(line!=null){
      text+=(line+"\r\n");
      line=br.readLine();
    }
    
    return text;
  }
  private String readIMG (File f,String datType)throws IOException {
        BufferedImage bI = ImageIO.read(f);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ImageIO.write(bI, datType, byteArrayOutputStream);
           
        return new String(byteArrayOutputStream.toByteArray());
 
    }
  private void save(File f)throws Exception{
    PrintWriter pw= new PrintWriter(f);
    pw.write(jta1.getText());
    pw.flush();
    
  }
  private String decrypt()throws Exception{
    long key=0;
    char[] buffer=jpf1.getPassword();
    String s=jta1.getText();
    for(int i=0;i<buffer.length;i++){
      key+=(long)buffer[i];
    }     
        buffer = new  char[s.length()];
        s.getChars(0,s.length(),buffer,0);
        for(int i=0;i<s.length();i++){
            buffer[i]+=key;
        }
        s = new String(buffer);
    return s;
  }
  private String encrypt()throws Exception{
    long key=0;
    char[] buffer=jpf1.getPassword();
    String s=jta1.getText();
    for(int i=0;i<buffer.length;i++){
      key+=(long)buffer[i];
    }     
        buffer = new  char[s.length()];
        s.getChars(0,s.length(),buffer,0);
        for(int i=0;i<s.length();i++){
            buffer[i]-=key;
        }
        s = new String(buffer);
    return s;
  }
    private void jb1_Action(ActionEvent evt)throws Exception{
    File f = chooseFile();
    String[] datType={"txt","jpg","jpeg","png","gif"};
    int index=0;
    for(;!f.getName().toLowerCase().endsWith(datType[index]);index++){}
    switch(index){
    case 0:
      jta1.setText(readTXT(f));
      break;
    case 1: case 2: case 3: case 4:
      jta1.setText(readIMG(f,datType[index]));
      break;
    default:
      jta1.setText("Dieser Dateityp wird nicht unterstützt");
      break;
    
    }
  }
  private void jb2_Action(ActionEvent evt)throws Exception{
    File f=chooseSaveFile();
    f.createNewFile();
    save(f);
    
  }
  private void jb3_Action(ActionEvent evt)throws Exception{
    jta1.setText(decrypt());
  }
  private void jb4_Action(ActionEvent evt)throws Exception{
    jta1.setText(encrypt());
  }     
  public static void main(String[] args) throws Exception {
    new ApplicationA();
  }

}
 
Zuletzt bearbeitet von einem Moderator:
B

blubbrezn

Gast
ich glaub ich weis jezt wo das problem liegt
entweder beim einlesen oder beim schreiben werden die chars (2 Byte groß) in bytes gecastet
also brauch ich dort einen anderen stream der das nicht macht
aber welchen?
 

Andi_CH

Top Contributor
Finde doch mittels debugger oder sysouts raus wo das passiert - deine Aussage tönt so wie: " es passiert etweder ein Fehler oder es passiert keiner".

Wichtigste Regeln beim Debuggen:

Nimm einen Debugger (darum heisst der so)
Mach Ausgaben wo du meinst es habe einen Fehler
Reduziere dein Programm auf die Komplexität eines "Hello world" bis der Fehler entweder verschwindet oder isoliert ist ...
 
S

SlaterB

Gast
ein GUI-Programm ist in der Tat störend,
auch muss nicht gleichzeitig Text, Jpeg usw. im Programm stehen,
bzw. schränke deinen Code zu dem Teilbereich in dem du eine Frage hast, ein

String aus byte[] geht gar nicht, das ist absolut klar, in einer Bilddatei wirst du auch negative bytes haben und chars können nicht negativ sein,
das passt ganz schlecht zusammen,

wenn du chars brauchst, wandle zwischen Bytes und Chars vielleicht mit Base64 (Suchbegriff) um

-------

allgemeiner Tipp:
eine erste Antwort selbst zu schreiben ist ungünstig, damit verschwindet das Thema aus der Liste der Unbeantworteten,
so hatte ich es selber bisher auch nicht (mehr) gesehen, von Titel-Änderung am Anfang abgesehen
 
B

blubbrezn

Gast
ich hab das ganze jetzt ohne GUI und Dateiauswahl geschrieben
nur eine Testschleife die verschiedene Schlüssel ausprobiert

für einen schlüssel zwischen 0 und 8 funktioniert es und der String ist nacher wie vorher der selbe
aber ab 9 werden die umlaute wie ä und ü zu Zahlen
Java:
import java.io.*;

class TestMitSave {
    private String s,oldS;
    private File f2;
    
    public TestMitSave() {
       
        s=read(new File("C:\\Users\\Jonny\\Documents\\hi.txt"));
                //ursprüngliche Datei einlesen
        oldS=s;
                //String zum vergleichen
        f2=new File("C:\\Users\\Jonny\\Documents\\bla.txt");
                //Datei in die der verschlüsselte Text soll
        for(int i=0;i<15;i++){
                //Schleife zum Testen verschiedener schlüssel i
          s=oldS;
          System.out.println(s);
          lockString(i);
                //mit Schlüssel i verschlüsseln
          save(s);
                //in f2 speichern
          if(s.compareTo(read(f2))!=0)System.out.println("read!=save bei Schlüssel: "+i);
                //vergleich ob verschlüsselter String s dem eingelesenen String entspricht
          s=read(f2);
          System.out.println("nach lesen: "+s);
          unlockString(i);
          System.out.println("nach unlock: "+s);
          if(oldS.compareTo(s)!=0)System.out.println("Fehler mit Schlüssel: "+i);
                //vergleiche AnfangsString mit dem wieder entschlüsselten String s
          System.out.println("----------------------");
        }
    }
    public void lockString(int key){
        char[] buffer;
        buffer = new  char[s.length()];
        s.getChars(0,s.length(),buffer,0);
        for(int i=0;i<s.length();i++){  //zu jedem char wird der Schlüssel dazu addiert
            buffer[i]+=key;
        }
        s = new String(buffer); //aus dem char Array wird wieder ein string gebildet
    }
    public void unlockString(int key){
        char[] buffer;
        buffer = new  char[s.length()];
        s.getChars(0,s.length(),buffer,0);
        for(int i=0;i<s.length();i++){ //von jedem char wird der schlüssel wieder agezogen
            buffer[i]-=key;
        }
        s = new String(buffer); //aus dem char Array wird wieder ein string gebildet
    }
    private String read (File f) {
      try {
          String text="";
          int buf;
          BufferedReader br= new BufferedReader(new FileReader(f));
          while((buf = br.read())!=-1){  //einlesen aus der Datei mit BufferedReader
            text+=(char)buf;
          }
          return text;
      } catch (IOException e) {
        System.err.println(e);
        return null;
      }
    }
    private void save(String text){
      try {
        int len =text.length();
        char[] buf=new char[len];
        text.getChars(0, len, buf, 0);
        BufferedWriter bw=new BufferedWriter(new FileWriter(f2));
        bw.write(buf);  //schreiben von text in die Datei mit BufferedWriter
        bw.flush();
      } catch (IOException e) {
        System.err.println(e);
      }

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

SlaterB

Gast
du dürftest denselben Fehler haben wenn du den String einfach nur einliest,
also eine Ausgabe in Zeile 10 ist auch schon schlecht oder?
mit deinem restlichen Verschlüsselungscode hätte das dann nichts zu tun,

du liest wahrscheinlich eine mit Windows-Editor oder ähnlich komisch erstellte Datei ein,
dafür musst du ein bestimmtes Encoding/ Charset angeben:
Java:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f), "Cp1250"));

erstelle ansonsten deine Textdateien mit einem fähigen Texteditor aus dem Internet,
oder auch mit Java selber, einen Text aus Quelltext oder Konsole oder GUI-Eingabe mit BufferedWriter speichern,
das wird Java dann auch gut lesen können mit den einfacheren Befehlen

-----

edit: obwohl, wieso geht es dann mit 0-8..,
vielleicht liege ich falsch, aber bitte soweit prüfen
 

blubbrezn

Mitglied
Stimmt die Ausgabe vor dem verschlüsseln war auch schon falsch (umlaute wurden nicht richtig gelesen und mit % angezeigt), deshalb ging es warscheinlich von 0-8
jetzt wird es richtig eingelesen alle umlaute nach dem einlesen sind richtig
danke dafür:toll:

hi.txt hab ich neu erstellt mit eigener GUI (hi.txt hat jetzt auch nicht mehr die Windows üblichen "\n\r" Zeilenumbrüche sondern "\n")

ich hab bei der Ausgabe auch gleich das charset mit angegeben, also:
Java:
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f2),"Cp1250"));

das ist die Ausgabe, aber ich versteh nicht wieso verschiedene Zeichen immer zum gleichen werden
und bei schlüssel 3 is irgend was ganz seltsames weil "nach lesen:" nicht angezeigt wird
Code:
hallo ÄTsch
so ist das wenn ÄÜÖß äöü
mit meinem Programm gespeichert wird()
nach lesen: hallo ÄTsch
so ist das wenn ÄÜÖß äöü
mit meinem Programm gespeichert wird()
nach unlock: hallo ÄTsch
so ist das wenn ÄÜÖß äöü
mit meinem Programm gespeichert wird()
----------------------
hallo ÄTsch
so ist das wenn ÄÜÖß äöü
mit meinem Programm gespeichert wird()
read!=save bei Schlüssel: 1
nach lesen: ibmmp!?Utdi♫♂tp!jtu!ebt!xfoo!?Ý×?!?÷ý♫♂nju!nfjofn!Qsphsbnn!hftqfjdifsu!xjse)*
nach unlock: hallo >Tsch
so ist das wenn >ÜÖ> >öü
mit meinem Programm gespeichert wird()
Fehler mit Schlüssel: 1
----------------------
hallo ÄTsch
so ist das wenn ÄÜÖß äöü
mit meinem Programm gespeichert wird()
read!=save bei Schlüssel: 2
nach lesen: jcnnq"?Vuej☼♀uq"kuv"fcu"ygpp"???á"???☼♀okv"ogkpgo"Rtqitcoo"igurgkejgtv"yktf*+
nach unlock: hallo =Tsch
so ist das wenn ===ß ===
mit meinem Programm gespeichert wird()
Fehler mit Schlüssel: 2
----------------------
hallo ÄTsch
so ist das wenn ÄÜÖß äöü
mit meinem Programm gespeichert wird()
read!=save bei Schlüssel: 3
plw#phlqhp#Surjudpp#jhvshlfkhuw#zlug+,
so ist das wenn ÄÜ<ß ä<<
mit meinem Programm gespeichert wird()
Fehler mit Schlüssel: 3
----------------------
hallo ÄTsch
so ist das wenn ÄÜÖß äöü
mit meinem Programm gespeichert wird()
read!=save bei Schlüssel: 4
nach lesen: lepps$?Xwgl◄♫ws$mwx$hew${irr$??Ú?$?ú?◄♫qmx$qimriq$Tvskveqq$kiwtimglivx${mvh,-
nach unlock: hallo ;Tsch
so ist das wenn ;;Ö; ;ö;
mit meinem Programm gespeichert wird()
Fehler mit Schlüssel: 4
----------------------
hallo ÄTsch
so ist das wenn ÄÜÖß äöü
mit meinem Programm gespeichert wird()
read!=save bei Schlüssel: 5
nach lesen: mfqqt%ÉYxhm↕☼xt%nxy%ifx%|jss%Éá?ä%é??↕☼rny%rjnsjr%Uwtlwfrr%ljxujnhmjwy%|nwi-.
nach unlock: hallo ÄTsch
so ist das wenn ÄÜ:ß ä::
mit meinem Programm gespeichert wird()
Fehler mit Schlüssel: 5
----------------------
 
S

SlaterB

Gast
ich werde leider bis Montag nicht mehr gut testen können,
vielleicht schaut vorher wer anders rein
 

blubbrezn

Mitglied
:applaus::toll::applaus:
noch mal vielen vielen Dank an SlaterB und alle anderen die mir hier geholfen haben

diese Zeile hat mir den Entscheidenden Anstoß gegeben:
Java:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f), "Cp1250"));
ich habe mir schon gedacht das es mit den charsets zusammenhängt, aber ich hab gedacht das Reader und Writer automatisch Unicode als Charset haben,weil sie Chars einlesen und schreiben
aber anscheinend übernehmen sie den Charset des eingelesenen Text (sonst würde irgent ein wirwar herauskommen)

"Cp1250" oder "Cp1252" haben nur 8Bit reichen nur von 0-255 ich habe aber mit Chars gearbeitet und bin dann sehr schnell außerhalb diesem Bereich gekommen

ich hab jetzt einfach eine Textdatei mit "unicode" als Charset erzeugt, meine Reader und Writer auch auf unicode gesetzt. und jetzt hab ich keine Probleme mehr.

ich hab nur noch eine Frage ???:L : kann man, einen eingelesenen Text in ein anderes Charset konvertieren oder das Charset eines eigelesenen Textes herausfinden?
 

Neue Themen


Oben