Потеря байтов в конце при использовании чанкованной расшифровки в Android

Сначала я создал небольшую программу шифрования / дешифрования на Java/Android. Ничего особенного в этом просто нет, поэтому никаких буферов или чего-то еще. Использовал Iv и Salt, там я записал соль и iv в начале файла (24 байта) . Эта первая версия была в состоянии en/decrypt файл и оба файла, где двоичные файлы одинаковы в конце.

Теперь я попытался не читать и обрабатывать весь файл сразу, но за один шаг с буфером (размер 1024 байта) . Я изменил свой cipher.doFinal несколько cipher.update и один пустой cipher.doFinal в конце.

Шифрование:

byte[] salt = {1, 2, 3, 4, 5, 6, 7, 8};
byte[] iv = {23, 45, 23, 12 , 39, 111, 90, 1, 2, 3, 4, 5, 6, 7, 8, 9};

FileInputStream fis = new FileInputStream(f);
byte[] buffer = new byte[1024];

byte[] output = new byte[24];
cpyArray(iv, output, 0);
cpyArray(salt, output, 16);

FileOutputStream fos = new FileOutputStream(new File(f.getPath() + ".enc"));
fos.write(output);


Cipher cipher = getcCipher(pass, salt,iv, Cipher.ENCRYPT_MODE);

for(int length; (length = fis.read(buffer)) > 0; ) { 
    byte[] realbuffer = new byte[length];
    if (length != 1024) {
        cpyArrayUntil(buffer, realbuffer, 0, length);
    } else {
        realbuffer = buffer;
    }
    byte[] chipped = cipher.update(realbuffer)
    fos.write(chipped);
    System.out.println("Chipped: " + chipped.length);
}
cipher.doFinal();
fis.close();
fos.close();

Дешифрирование:

 Cipher cipher = getcCipher(pass, salt, iv, Cipher.DECRYPT_MODE);
byte[] buffer = new byte[1024];
for(int length; (length = fis.read(buffer)) > 0; ) {
    byte[] realbuffer = new byte[length];
    if (length != 1024) {
        cpyArrayUntil(buffer, realbuffer, 0, length);
    } else {
        realbuffer = buffer;
    }
    byte[] chipped = cipher.update(realbuffer)
    fos.write(chipped);
    System.out.println("Chipped: " + chipped.length);
}
cipher.doFinal();

Итак, проблема сейчас, когда я запускаю это и сравниваю файлы в конце,
1. Я получаю BadPaddingExeption на doFinal при расшифровке. а также
2. В файле, который был En-and Decrypted, в конце файла отсутствуют 29 байт.

Не беспокойтесь, Iv и соль обычно случайные, просто статические для тестирования.

Кроме того, отсутствующие байты зависят от размера файла. Просто попробовал другой файл, и ему не хватает 21 байта.

1 ответ

Решение

Вы отбрасываете вывод doFinal() в ваших зашифрованных и дешифрованных подпрограммах. Они оба возвращают byte[] который также должен быть записан в ваш вывод, чтобы зашифрованный зашифрованный текст или расшифрованный открытый текст были полными и действительными.

Другие вопросы по тегам