Probleme bei XOR verschlüsselung !

Status
Nicht offen für weitere Antworten.

JavaOpfer

Mitglied
@ ALLE PROFIS:

Habe ein Problem mit einem Verschlüsselungsprogramm. Das Kuriose ist, mit einem Selbst erzeugten Schlüssel (per RandomAccess) und einem Text ohne mehrer Absätze und ohne Sonderzeichen funktioniert die Sache. Habe jetzt versucht alles UTF8 konform zu machen, aber ohne gutes Ergebnis. Scheint beim speichern oder Öffnen Probs zu geben.

Folgender Code
Class Editor:

Code:
void doSaveCommand() {

		FileDialog file = new FileDialog(TextEditor2.this, "Save File",
				FileDialog.SAVE);
		file.setVisible(true);
		String currentFile;
		if ((currentFile = file.getFile()) != null) {
			String filename = file.getDirectory() + currentFile;
			setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			File f = new File(filename);
			 try{
				 
				 BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)));
				 w.write(pane.getText());
				 w.close();
				 			 }
			 catch(Exception e){
				 	System.err.print("Fehler beim Speichern: "+e);
 	}	
			setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}

	}
	void doSaveKeyCommand(String key) {

		FileDialog file = new FileDialog(TextEditor2.this, "Save KeyFile",
				FileDialog.SAVE);
		file.setVisible(true);
		String currentFile;
		if ((currentFile = file.getFile()) != null) {
			String filename = file.getDirectory() + currentFile;
			setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			File f = new File(filename);
			 try{
				 
				 BufferedWriter w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f)));
				 Codierer co = new Codierer();
					key = co.byteUtfShit(key);
				 w.write(key);
				 w.close();
				 			 }
			 catch(Exception e){
				 	System.err.print("Fehler beim Speichern: "+e);
 	}	
			setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}

	}

	void doOpenCommand() {

		pane.setText("");

		FileDialog file = new FileDialog(TextEditor2.this, "Open File",
				FileDialog.LOAD);
		file.setFile("*.java;*.txt"); // Set initial filename filter
		file.setVisible(true);
		String currentFile;
		if ((currentFile = file.getFile()) != null) {
			String filename = file.getDirectory() + currentFile;
			// char[] data;
			setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			// File f = new File (filename);
			 
			 String line;
			 String line2 = "";
			 String lineKey="";
			try {
				RandomAccessFile ra = new RandomAccessFile(filename, "r");
				while ( (line=ra.readLine()) != null )
					{
					line2 = line2+line+"\n";
					lineKey = lineKey+line;
					}
				Codierer co = new Codierer();
				line2 = co.byteUtfShit(line2);
				pane.setText(line2);
			
				this.lineKey = lineKey;
				
			
			} catch (Exception e) {
				System.err.print("Fehler beim öffenen (IO):" + e);
			} //catch(FileNotFoundException e){}

			setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}
	}
	void doOpenKeyCommand() 
	{
		FileDialog file = new FileDialog(TextEditor2.this, "Open a Keyfile",
				FileDialog.LOAD);
		file.setFile("*.*"); // Set initial filename filter
		file.setVisible(true);
		String currentFile;
		if ((currentFile = file.getFile()) != null) {
			String filename = file.getDirectory() + currentFile;
			setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			 
			 String line;
			 String line2 = "";
			try {
				RandomAccessFile ra = new RandomAccessFile(filename, "r");
				while ( (line=ra.readLine()) != null )
					line2 = line2+line+"\n";
				
				Codierer co = new Codierer();
				line2 = co.byteUtfShit(line2);
				keydata = line2;
				
			
			} catch (Exception e) {
				System.err.print("Fehler beim öffenen (IO):" + e);
			} //catch(FileNotFoundException e){}

			setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}
	}

private void doMakeKey()
	{
		//text an codierer übergeben (für die länge des Keys)
		//soll den Key unter einer Datei nach wahl des Users spiechern.
		int z1, z2 = 0;
		Codierer co = new Codierer();
		
		this.lineKey = pane.getText();
		while(z2 < 2)
			z2 = co.random(9);
		z1 = z2 * /*pane.getText()*/this.lineKey.length();
		String key = co.makeKey(z1);
		keydata = key;
		doSaveKeyCommand(key);
		
	}
	private void doCryptTextCommand()
	{
		if (keydata == null)
		{
			JOptionPane.showMessageDialog(null, "Sie haben noch keinen Schlüssel erstellt!","FEHLER", JOptionPane.WARNING_MESSAGE );
		}
		else
		{
			//Hier die Übergaben an die verschlüsselung !!! Der Offset wird in der verschlüsselten Date gespeichert!
			// keydata
			// pane.getText();
			Codierer co = new Codierer();
			this.lineKey = pane.getText();
			pane.setText(co.codiere(this.lineKey, this.keydata));
			this.lineKey = pane.getText();
			JOptionPane.showMessageDialog(null, "Verschlüsselung war erfolgreich","Bestätigung", JOptionPane.INFORMATION_MESSAGE );
		}
	}
	private void doEncryptTextCommand()
	{
		if (keydata == null)
		{
			JOptionPane.showMessageDialog(null, "Sie haben noch keinen Schlüssel geladen!","FEHLER", JOptionPane.WARNING_MESSAGE );
		}
		else
		{
			//Der verschlüsselte Text befindet sich in pane, der key sollte geladen sein!
			// keydata
			// pane.getText();
			Codierer co = new Codierer();
			//this.lineKey = pane.getText();
			//pane.setText(co.deCodiere(/*pane.getText()*/this.lineKey, keydata));
			String text = (co.deCodiere(/*pane.getText()*/this.lineKey, keydata));
			//Text um die Hinterste Stelle schneiden um den Offset wegzu bekommen:
			
			text = text.substring(0, text.length()-1);
			pane.setText(text);
			JOptionPane.showMessageDialog(null, "Entschlüsselung war erfolgreich","Bestätigung", JOptionPane.INFORMATION_MESSAGE );
		}
	}

und Class Codierer:
Code:
import java.io.UnsupportedEncodingException;
import java.security.SecureRandom;
import java.util.Random;

import javax.swing.JOptionPane;

/**
 * @author Trax
 *
 */
public class Codierer {

	/**
	 * Codiert zwei int Arrays !!!
	 * @param text
	 * @param key
	 * @return
	 */
	public String codiere(String text, String key)
	{
		Codierer co = new Codierer();
		text = co.byteUtfShit(text);
		//key = co.byteUtfShit(key);
		
		System.out.println("TEXT: "+text);
		int[] texti = strIntToInteger(text);
		int[] keyi = strIntToInteger(key);
		int offset;
		
		//Offsetwert einbauen (zwischen 0 und text.length), da der Key ja immer mindestens 2* length ist!!!
		if(text.length() >= key.length())                                                                      
			offset = 0;
		else
			offset = 0;
			//offset = random(text.length()/2);
		
		JOptionPane.showMessageDialog(null, "OffSet Wert: "+offset,"Bestätigung", JOptionPane.INFORMATION_MESSAGE );
		
		for(int i = 0; i<texti.length; i++)
		{
			texti[i]^=keyi[i+offset];
			//System.out.println("i: "+i+", +offset: = "+offset+i);
		}
		
		
		text = parseBack(texti);
		System.out.println("Offset: "+(char)offset);
		return(text+(char)offset);
	}
	public String deCodiere(String text, String key)
	{
		int[] texti = strIntToInteger(text);
		int[] keyi = strIntToInteger(key);
		
		// auslesen des Offsets, parsen in int:
		int offset = (int)text.charAt(text.length()-1);
		System.out.println("Der offset im deCodierer: "+offset);
		
		for(int i = 0; i< texti.length; i++)
		{
			texti[i]^=keyi[i+offset];
			
		}
        //der offset muss noch aus dem Ergebnis geschnitten werden!!!
		text = parseBack(texti);
		return(text);
	}
	public String byteUtfShit(String text)
	{
		try {
			return (new String(text.getBytes(), "UTF-8"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return text;
		}
	}
	/**
	 * erstellt einen beliebig langen Schlüssel nach secureRandom
	 * @param laenge ist die länge des zu erstellenden Keys
	 * @return
	 */
	public String makeKey(int laenge)
	{
		SecureRandom sc = new SecureRandom();
		String strKey = "";
		for (int i = 0; i <= laenge; i++)
		{
			int key = sc.nextInt(10);
			
			strKey = strKey+(char)key;
		}
		System.out.println("Key: "+strKey);
		return strKey;
	}
	
	
	public int random(int max)
	{
		Random rand = new Random();
		return(rand.nextInt(max));
	}
	
	/**
	 * Wandelt einen Schlüssel bestehend aus Zeichen um in Int[]
	 * @return
	 */
	public int[] strIntToInteger(String key)
	{
		int[] ret2 = new int[key.length()];
		
		for (int i = 0; i < key.length(); i++)
		{
			ret2[i] = (int)key.charAt(i);
		}
		
		return ret2;
	}

Wär echt toll wenn da jemand nen Tipp hätte!
PS der Offset ist hier auf 0 gesetzt und erstmal nicht relevant!
 
Code:
   public String byteUtfShit(String text)
   {
      try {
         return (new String(text.getBytes(), "UTF-8"));
      } catch (UnsupportedEncodingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         return text;
      }
   }
völliger Unsinn, macht einfach nur deinen String kaputt

denk mal drüber nach oder such im Forum nach getBytes
 
Eing guter Tipp gewesen :lol: und ich hab so lange getüftelt 😳

Jetzt sieht es so aus und es scheint zu funktionieren:
Code:
public String codiere2 (String text, String key, int offset)
	{
		//Alles zu Bytes Casten:
		byte[] keyB = key.getBytes();
		byte[] textB = text.getBytes();
		byte[] keyBU = new byte[textB.length];
		
		int c = offset;
		
		for(int i = 0; i < textB.length; i++)
		{
			if(c >= keyB.length)
				c = 0;
			
			keyBU[i] = keyB[c];
			c++;
		}
		int[] code = new int[textB.length];
		for (int i = 0; i < textB.length; i++)
		{
			code[i] = (int)textB[i]^(int)keyBU[i];
		}
		
		//zurück zu string:
		text = "";
		for (int i = 0; i< code.length; i++)
		{
			text = text + (char)code[i];
		}
		return text;
	}
	
	
	public static void main(String[] args) {
		System.out.println("Programm gestartet!\n\n");
		Coder coder = new Coder();
		String text ="Hallo ich bin der lange text zum verschlüsseln\n und ich                  will entschlüsselt werden       jetzt";
		String key = "und ich bin der key um      dieses alles verschlüsseln zu können 123456789000000278272728782787287287818781778178727727277283883883838";
		int offset = 10;
		String code = coder.codiere2(text, key, offset);
		
		System.out.println("Verschlüsselte Datei: "+code+"\n\n\n");
	    code = coder.codiere2(code, key, offset);
		System.out.println("Entschlüsselte Datei: "+code+"\n\n\n");

	}

Meine einzige Sorge ist jetzt, wenn ich damit z.B. einen Text verschlüsseln will und als Key eine beliebig große Datei nehme - dieses dann abspeicher um es später wieder zu entschlüsseln! - Wird diesmal alles funktionieren. Vorher war das Hauptproblem, dass die Entschlüsselung von Texten mit Sonderzeichen oder vielen Absätzen nicht funktionierte.

Ich werd es gleich mal probieren.
 
Ok die Sache funktioniert zwar bei normalen Texten, aber wenn ich z.B. einen Quellcode verschlüssel, bekomme ich nur noch Quark raus. Kann das am Zeichensatz liegen ???
 
mal was anderes, Java bietet nicht umsonst ne Kryptographie API an 🙂

Falls du dich also richtig mit Kryptographie in java befassen willst, schau dir mal die JCA/JCE an.
 
Ja ist mir auch bewusst. Aber das ist ne verd**** Aufgabe die ich machen soll und deshalb ist hier die XOR angesagt.

Bin aber dem Problem heute schon näher gekommen....
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben