ŘEŠENÍ
Ano, opravdu stačilo udělat XOR (exkluzivní disjunkci) mezi souborem secret_key.dat a secret.dat a výsledek uložit jako .zip. Respektive načíst prvni byte ze souboru secret_key.dat a první byte ze souboru secret.dat a mezi nimi udělat XOR, tím získáme první byte výsledného zipu. Pak pokračujeme až do konce souborů. Využívá se této vlastnosti funkce XOR:
A XOR B = C
B XOR C = A
Tato vlastnost se hojně využívá v počítačové kryptografii.
Program může vypadat, třeba takto (Java):
package testicek;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
*
* @author MaSo
*/
public class Decrypter {
public static void main(String[] args) throws Exception {
writeBytesToFile("desecret.zip", decryptFile("secret.dat", readBytesFromFile("secret_key.dat")));
}
private static int[] decryptFile(String pathToFile, byte[] key) throws IOException {
byte[] data = readBytesFromFile(pathToFile);
int[] ret = new int[data.length];
for (int i = 0; i < data.length; i++) {
ret[i] = key[i] ^ data[i];
}
return ret;
}
private static void writeBytesToFile(String filename, int[] data) throws FileNotFoundException, IOException {
try (FileOutputStream fos = new FileOutputStream(filename)) {
for (int i = 0; i < data.length; i++) {
fos.write(data[i]);
}
}
}
private static byte[] readBytesFromFile(String filename) throws IOException {
Path path = Paths.get(filename);
return Files.readAllBytes(path);
}
}
Ovšem programovat se nemuselo, stačilo použít utilitu od NirSoftu xorfiles o jejíž existenci jsem nevěděl. Příště vymyslím, něco těžšího...