Когда я шифрую или дешифрую файл с помощью AES, в конце файла появляются странные символы, это может быть проблема с буфером или проблема AES? - PullRequest
1 голос
/ 25 сентября 2019

Я хочу зашифровать некоторые данные и расшифровать их позже.Когда я это сделаю, в конце файла появятся странные символы.

Я попытался исправить размер буфера, когда это маленький файл.НО, когда файл больше, я предполагаю, что это странные значения в буфере, которые просто помещаются в файл, которые не сбрасываются или где-то еще на диске.но я не знаю, как справиться с этим с действительно большими файлами, из которых я не знаю точный размер.

Что я могу сделать, чтобы иметь более динамический буфер без превышения точного размера файла, который я читаю / пишу?

    private static void writeBytes(FileInputStream fis, ByteArrayOutputStream baos, FileOutputStream fos, long inSize)
            throws IOException {
        InputStreamReader isr = new InputStreamReader(fis);
        int read = 0;
        int bufsize = inSize < 1024 ? Math.toIntExact(inSize) : 1024;
        byte[] buf = new byte[bufsize];



        while ((read = fis.read(buf)) > 0) {
            byte[] ret = buf;
            //I think i should make it here more dynamica because i only need 
            //the new read data
            rounds++;
            ret = startEncryption(ret, baos);
            fos.write(ret);

        }

        fos.flush();
        fos.close();
        fis.close();

    }

INPUTFILE.txt

Hello StackOverflow
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
Some more Values exceeding 1024 Bytes
Some more Values exceeding 1024 Bytes
Some more Values exceeding 1024 Bytes
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
Bye StackOverflow

, затем шифрование и затем дешифрование

OUTPUTFILE.txt

Hello StackOverflow
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
Some more Values exceeding 1024 Bytes
Some more Values exceeding 1024 Bytes
Some more Values exceeding 1024 Bytes
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
testvaluestestvaluestestvaluestestvaluestestvaluestestvalues
Bye StackOverflowAZØgZ—»:ÔU
ßøëdKBqDûî=üõU,Ôžð~S¤‘H—[„FUùP!S?ª7­+Xnf ´ŸŸ‰Q¡yB3ÑJ€†€Þt2
:ÂSø¿#¡™,Íô1L䕲{nÿb>òVc•<ùhÇéJŒìÄ퀕¿šãe5³X”ââªüÄUÐNØÛzc!oläÃÝ“ª9iÛÂÐ  êÞ¡Þ)òSþ-Ðét½   |ˆ&š'wÌAr9ö[ì·K$rI2¸ˆÕ5õ[1X¿°¹W¡'Ù>ñg–…$}‘˜mnòÛò¢z­ÔŠÍBØÊH¸[®âù l+½&ˆ¸´üô°Žùdz資oÆ=ó×.ôNÛºi{z·ˆcø¯þÁ›<n?»Ñµ¼¼üÌ Y÷ÎCÚAbýK¡ƒÿÈù‡)´ž|/Åÿˆ(ë¤_ï|ÛL=¹Ã7¾JXº¿ÍoIŸY¬ôÍÙQÀÒ¸~ò!aËæÆ×"(›Ÿ¥¹°‚_ ‹Qj‚†a‰3)‰{Ãç|e

есть некоторые странные значения.

Ответы [ 2 ]

3 голосов
/ 25 сентября 2019

Вы всегда обрабатываете весь буфер, даже если последнее чтение, скорее всего, не заполнит буфер полностью.Вам нужно использовать переменную read, чтобы узнать, сколько байтов было прочитано, а затем обработать byte[] только до этого предела.

2 голосов
/ 25 сентября 2019
    while ((read = fis.read(buf)) > 0) {
        byte[] ret = Arrays.copyOf(buf, read);

Или передать ограничивающую информацию, если есть такой перегруженный метод:

    ... (buf, 0, read);

Кстати

Не используйте текстовый ввод с Reader (на самом деле вы действительно не использовали его):

Remove

InputStreamReader isr = new InputStreamReader(fis);

Или хотя бы укажите, в какой кодировке находятся считанные байты:

InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
...