problem z szyfrowaniem AES

Odpowiedz Nowy wątek
2008-09-06 16:48
0

Witam,
Mam taki kawałek kodu odpowiedzialny za odszyfrowanie pliku podanego jako 1 parametr i zapis do pliku z 2 parametru:

try {
     SecretKeySpec Key = new SecretKeySpec(getKey(pmKey), "Rijndael");
     Cipher Cipher1 = Cipher.getInstance("Rijndael");
     Cipher1.init(Cipher.DECRYPT_MODE, Key);

     int Size;
     while ((Size = pmInput.read(mBuffer)) > -1)
         pmOutput.write(Cipher1.update(mBuffer, 0, Size));

         pmOutput.write(Cipher1.doFinal());
} catch (Exception e) {
   throw e;
}

Gdy dekoduje plik 4,54 kb w lini Cipher Cipher1 = Cipher.getInstance("Rijndael"); jest rzucany wyjatek
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

Czy ktos umie mi pomoc?
Szyfrowanie AES / Rijndael / ECB
Klucz 256 b
Pozdrawiam

Pozostało 580 znaków

2008-09-06 19:45
0

Plik nie ma równej, podzielnej przez 16, długości w bajtach. Wczytaj plik jako tablicę bajtów i uzupełnij na końcu do wymagenej wielkości.

Pozostało 580 znaków

2008-09-07 09:46
0

Czy moglbys napisac jak dopisac cos do takiego pliku, czy odszyfruje sie on prawidlowo jesli cos do niego dopisze?

Pozostało 580 znaków

2008-09-07 10:31
0

Tak. Po odszyfrowaniu musisz usunąć dopisane bajty, więc gdzieś musi być informacja o faktycznej długości danych. I nie muszą to być zawsze takie same bajty, mogą to być niezainicjowane śmieci z pamięci.

Szyfrowanie:

  • odczytujesz rozmiar pliku (size)
  • tworzysz bufor o rozmiarze = size + 8 bajtów na rozmiar pliku + dopełnienie do wielokrotności 16 = (size + 8 + 15) / 16 * 16
  • na początku bufora zapisujesz rozmiar pliku, dalej dopisujesz zawartość pliku
    Odszyfrowanie:
  • odszyfrowujesz
  • odczytujesz rozmiar z początku bufora
  • zapisujesz do pliku resztę buforu o odczytanej długości

Pozostało 580 znaków

2008-09-07 11:47
0

Chcialbym tylko dodac ze nie mam wplywu na szyfrowanie. Dostaje plik, klucz i mam go odszyfrowac.
Jesli plik jest maly tak jak ten 5,45k jest problem natomiast wieksze 18k ten sam kod odszyfrowywuje
Czy ktos ma jakis pomysl?

                         while ((lvSize = pmInput.read(mBuffer)) > -1)
            {
                System.out.println(lvCipher.getBlockSize());
                System.out.println(lvSize);
                if(lvSize == mBufferSize)
                {
                    pmOutput.write(lvCipher.update(mBuffer, 0, lvSize));
                }
                else
                {
                    byte[] mBuffer1 = new byte[lvSize];
                    for (int i = 0; i < lvSize; i++) 
                    {
                        mBuffer1[i] = mBuffer[i];
                    }                   
                    pmOutput.write(lvCipher.update(mBuffer1, 0, lvSize));
                    break;
                }               
            }

Mam teraz taki kod, pytanie jak obsluzyc jesli jestem w ELSE

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0