XOR funktioniert mit Text-, aber nicht Binärdateien

Du machst es dir immer noch zu kompliziert :)

Hab leider keine Zeit dein Beispiel abzuändern, habe aber kurz ein auf das nötigste beschränkte Programm gebastelt ich hoffe das hilft dir weiter.

Wer sich über Ähnlichkeiten wundert, es basiert auf dem Dateien kopieren Beispiel aus der Javainsel

Java:
public class Crypt {

  public static void cryptFile(String file, String password) {
    FileInputStream fis = null;
    FileOutputStream fos = null;

    try {
      fis = new FileInputStream(file);
      fos = new FileOutputStream(file + ".crypt");

      crypt(fis, fos, new Password(password.getBytes()));
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (fis != null) {
        try {
          fis.close();
        } catch (IOException e) {
        }
      }
      if (fos != null) {
        try {
          fos.close();
        } catch (IOException e) {
        }
      }
    }
  }

  private static void crypt(InputStream in, OutputStream out, Password password) throws IOException {
    byte[] buffer = new byte[0xFFFF];
    for (int len; (len = in.read(buffer)) != -1;) {
      for (int i = 0; i < len; i++) {
        buffer[i] ^= password.nextByte();
      }
      out.write(buffer, 0, len);
    }
  }
}

Java:
public class Password {

  byte[]value;
  int pointer;

  public Password(byte[] value) {
    this.value = value;
    pointer=0;
  }

  public byte nextByte(){
    byte ret;
    if(pointer<value.length){
      ret= value[pointer];
      pointer++;
    }
    else{
      pointer=0;
      ret= value[pointer];
      pointer++;
    }
    return ret;
  }
}

P.S. Habe gerade noch ein Blick auf Toms Beispiel geworfen, der macht es im Grunde genauso wie ich, nur viel eleganter :)
Was Du nachwievor verkehrt machst, ist dass Du die eingelesene Datei in Strings umwandelst, was bei binären Daten Probleme bereitet:

diese Zeile ist unnötig:
bytesOfBlock = String.valueOf(block).getBytes("UTF-8");
 
Zuletzt bearbeitet:
Ah, vielen Danke.
Das Lesen hatte bei mir einen Fehler, ohne for gehts besser.
Und dann noch die XOR-Operation, die habe ich einfach so ähnlich wie du gemacht.
Jetzt funktioniert es. :)

Falls es wem interessiert:
Java:
for(long l = 0; l < fileSize; l+=StartCrypt.BLOCK_LENGHT)
{
	byte[] read = new byte[StartCrypt.BLOCK_LENGHT];

	try
	{				
		readFile.getStream().read(read, 0, read.length);
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
	
	Crypt.run(read, pass);
	writeFile.write(read);
}
Java:
static void run(byte[] block, Password password)
{
	String pass = password.getPassword();
	byte[] bytesOfPassword = pass.getBytes();
	
	for(int i = 0; i < block.length; i++)
		block[i] ^= bytesOfPassword[i % pass.length()];
}
 
freut mich geholfen zu haben, die XOR-Funktion ist ok wie Du sie jetzt machst, Tom hängt da ja auch nur noch ein "& 0xFF" ran, was an der Stelle aber sowieso ohne Wirkung bleibt, da sofort wieder nach byte gecastet wird, das Ergebnis ist exakt das gleich.
 
Zurück