Android-Entschlüsselung: Fehler beim Finalisieren der Chiffre
Ich verwende Android zum Verschlüsseln und Verschlüsseln von Bildern, die zwischen Apps gesendet werden.
Die Verschlüsselung funktioniert gut, aber wenn die Datei am Ziel eintrifft, wird sie nicht entschlüsselt. Jetzt habe ich die Datei in die Ziel-App kopiert und sie mit Software von Drittanbietern erfolgreich entschlüsselt.
Der Fehler, den ich erhalte, ist: "Fehler beim Finalisieren der Verschlüsselung" bei CipherInputStream (CipherInputStream.java:107), verursacht durch IllegalBlockSizeException.
,Der Verschlüsselungs- und Entschlüsselungscode ist unten angegeben:
public static String encrypt(String plainFile, String encryptedFile) throws IOException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException {
// Here you read the cleartext.
File extStore = Environment.getExternalStorageDirectory();
FileInputStream fis = new FileInputStream(plainFile);
// This stream write the encrypted text. This stream will be wrapped by
// another stream.
FileOutputStream fos = new FileOutputStream(encryptedFile);
// Length is 16 byte
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES");
// Create cipher
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, sks);
// Wrap the output stream
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
// Write bytes
int b;
byte[] d = new byte[8];
while ((b = fis.read(d)) != -1) {
cos.write(d, 0, b);
}
// Flush and close streams.
cos.flush();
cos.close();
fis.close();
return encryptedFile;
}
static String decrypt(String plainFile, String encryptedFile) throws IOException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException {
File encFile=new File(encryptedFile);
FileInputStream fis = new FileInputStream(encFile);
FileOutputStream fos = new FileOutputStream(plainFile);
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
"AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, sks);
CipherInputStream cis = new CipherInputStream(fis, cipher);
int b;
byte[] d = new byte[8];
while ((b = cis.read(d)) != -1) {
fos.write(d, 0, b);
}
fos.flush();
fos.close();
cis.close();
return plainFile;
}
Irgendwelche Ideen? Vielen Dank
Ronan
Update: Die empfangene verschlüsselte Datei ist konsistent 1 Byte kleiner als die ursprüngliche Datei, die den Fehler zu erzeugen scheint. Der Fehler bezüglich der Blockgröße wird in der Codezeile ausgelöst, während ((b = fis.read (d))! = -1) {in der Entschlüsselungsfunktion.
Update: Danke für das Feedback. Die ultimative Lösung ist wie unter @ definierlast Block unvollständig mit CipherInputStream / CipherOutputStream, auch mit Auffüllen von AES / CBC / PKCS5Padding
Ronan