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

Antworten auf die Frage(0)

Ihre Antwort auf die Frage