Hallo Java'lers,
Vorweg: Ich bin Umsteiger von C# nach Java und setze mich gerade mit den alltäglichen Problemen auseinander.
Jetzt komme ich an einem bestimmtem Problem aber einfach nicht weiter. Es geht um Verschlüsselung mit AES.
Folgender Ablauf:
Ich verschlüssel eine Datei (z.B. jpg/pdf) mit Hilfe von der Cipher Klasse und einem AES Key. -> Funktioniert (denke ich)
Wenn ich die Datei allerdings wieder entschlüssel, bekomme ich eine kaputte Datei zurück.
Bei einem Bild sagt Windows beispielsweise es sei defekt...
Ich habe beide Dateien (original und wieder-entschlüsselte) in einem Editor geöffnet und miteinander verglichen. Und folgendes festgestellt (dies gilt übrigens nicht nur bei Bild-Dateien sondern auch bei beispielsweise PDF-Dateien).
Die ersten paar Bytes (im Header der Datei) stimmen komplett nicht überein und sind sogar unterschiedlich lang. Überschreibe ich die entsprechenden Bytes in dem wieder-entschlüsselte File mit den originalen Bytes und speicher dieses File ab, so lässt sich das Bild/PDF einwandfrei öffnen.
Mir stellt sich nun natürlich die Frage, wieso die ersten paar Bytes jeder Datei nach dem Verschlüsseln/Entschlüsseln unterschiedlich sind !?
Zum Debuggen habe ich bereits überprüft ob es an der Art des Lesens/Schreibens liegt, aber dabei fiel kein Fehler auf (die Datei wurde erfolgreich 'kopiert')...
Zur Verdeutlichung hier etwas Code:
Ich danke schon mal im voraus für Bemühungen
GenerateKey()
Erzeugt den AES Key der später zur Ver-/Entschlüsselung verwendet wird.
Encrypt()
Diese Methode verschlüsselt die Übergebene Datei und legt sie unter einem neuen Dateinamen ab
Decrypt()
Entschlüsselt die Übergebene Datei und legt sie unter einem neuen Dateinamen ab
Mit freundlichen Grüßen
SaschaSquare
Vorweg: Ich bin Umsteiger von C# nach Java und setze mich gerade mit den alltäglichen Problemen auseinander.
Jetzt komme ich an einem bestimmtem Problem aber einfach nicht weiter. Es geht um Verschlüsselung mit AES.
Folgender Ablauf:
Ich verschlüssel eine Datei (z.B. jpg/pdf) mit Hilfe von der Cipher Klasse und einem AES Key. -> Funktioniert (denke ich)
Wenn ich die Datei allerdings wieder entschlüssel, bekomme ich eine kaputte Datei zurück.
Bei einem Bild sagt Windows beispielsweise es sei defekt...
Ich habe beide Dateien (original und wieder-entschlüsselte) in einem Editor geöffnet und miteinander verglichen. Und folgendes festgestellt (dies gilt übrigens nicht nur bei Bild-Dateien sondern auch bei beispielsweise PDF-Dateien).
Die ersten paar Bytes (im Header der Datei) stimmen komplett nicht überein und sind sogar unterschiedlich lang. Überschreibe ich die entsprechenden Bytes in dem wieder-entschlüsselte File mit den originalen Bytes und speicher dieses File ab, so lässt sich das Bild/PDF einwandfrei öffnen.
Mir stellt sich nun natürlich die Frage, wieso die ersten paar Bytes jeder Datei nach dem Verschlüsseln/Entschlüsseln unterschiedlich sind !?
Zum Debuggen habe ich bereits überprüft ob es an der Art des Lesens/Schreibens liegt, aber dabei fiel kein Fehler auf (die Datei wurde erfolgreich 'kopiert')...
Zur Verdeutlichung hier etwas Code:
Ich danke schon mal im voraus für Bemühungen
GenerateKey()
Erzeugt den AES Key der später zur Ver-/Entschlüsselung verwendet wird.
Java:
// GLOBAL
public String CryptMode = "AES/CBC/PKCS7Padding";
public void GenerateKey() {
KeyGenerator keyGen;
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
char[] password = {'a', 'b', 'c'};
byte[] salt = SecureRandom.getSeed(8);
KeySpec spec = new PBEKeySpec(password, salt, 8, 256);
SecretKey tmp = factory.generateSecret(spec);
this.secret = new SecretKeySpec(tmp.getEncoded(), "AES");
final Cipher cipher = Cipher.getInstance(this.CryptMode);
//final Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, this.secret);
AlgorithmParameters params = cipher.getParameters();
iv = params.getParameterSpec(IvParameterSpec.class).getIV();
}
catch (Exception ex) {
LogToScreen(ex.getMessage());
}
}
Encrypt()
Diese Methode verschlüsselt die Übergebene Datei und legt sie unter einem neuen Dateinamen ab
Java:
public void Encrypt(String srcName, String destName) {
File path = Environment.getExternalStorageDirectory();
File file = new File(path, destName);
File fileinput = new File(path, srcName);
if (path.canWrite()) {
try {
final Cipher cipher = Cipher.getInstance(this.CryptMode);
cipher.init(Cipher.ENCRYPT_MODE, this.secret);
final FileOutputStream fos = new FileOutputStream(file);
final BufferedOutputStream bos = new BufferedOutputStream(fos);
final FileInputStream fis = new FileInputStream(fileinput);
final BufferedInputStream bis = new BufferedInputStream(fis); // ADDED
byte[] bin = new byte[bis.available()];
bis.read(bin, 0, bin.length);
bos.write(cipher.doFinal(bin));
bis.close();
fis.close();
bos.flush();
bos.close();
} catch (Exception e) {
e.printStackTrace();
LogToScreen("Encrypt:" + e.getMessage());
}
}
else {
LogToScreen("CanWrite = FALSE");
}
}
Decrypt()
Entschlüsselt die Übergebene Datei und legt sie unter einem neuen Dateinamen ab
Java:
public void Decrypt(String srcName, String destName) {
File path = Environment.getExternalStorageDirectory();
File file = new File(path, srcName);
File fileoutput = new File(path, destName);
try {
final Cipher cipher = Cipher.getInstance(this.CryptMode);
cipher.init(Cipher.DECRYPT_MODE, this.secret, new IvParameterSpec(this.iv));
final FileInputStream fis = new FileInputStream(file);
final BufferedInputStream bis = new BufferedInputStream(fis);
byte[] btest = new byte[bis.available()];
bis.read(btest, 0, btest.length);
final FileOutputStream fwrite = new FileOutputStream(fileoutput);
final BufferedOutputStream bwrite = new BufferedOutputStream(fwrite);
bwrite.write(cipher.doFinal(btest));
bwrite.flush();
bwrite.close();
fwrite.close();
} catch (Exception e) {
e.printStackTrace();
LogToScreen("Decrypt:" + e.getMessage());
}
}
Mit freundlichen Grüßen
SaschaSquare
Zuletzt bearbeitet: