CaspianTerrazzo
CaspianTerrazzo

Reputation: 2148

When I encrypt or decrypt a file with AES, there are weird characters in the End of the file, could that be a buffer issue or a AES issue?

I want to encrypt some data end decrypt it later. When I do there will be weird characters in the end of the file.

I tried to fix the buffersize when its a small file. BUT when the file is bigger, I assume there are weird values that are in the buffer that are just put into the file which are not flushed or somewhere else on the disk. But I don't know how to deal with that with really big files from which I don't know the exact size.

What can I do to have a more dynamic buffer without exceeding the exact filesize which I am reading/writing?

    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

then encryption and then decryption

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

there are some weird values.

Upvotes: 1

Views: 133

Answers (2)

Joop Eggen
Joop Eggen

Reputation: 109603

    while ((read = fis.read(buf)) > 0) {
        byte[] ret = Arrays.copyOf(buf, read);

Or pass limiting info if there is such an overloaded method:

    ... (buf, 0, read);

By the way

Do not use textual input with a Reader (actually you did indeed not use it):

Remove

InputStreamReader isr = new InputStreamReader(fis);

Or at least indicate which encoding the read bytes are in:

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

Upvotes: 2

Kayaman
Kayaman

Reputation: 73568

You're always processing the whole buffer, even though the last read most likely will not fill the buffer completely. You need to use the read variable to know how many bytes were read, then process the byte[] only up to that limit.

Upvotes: 3

Related Questions