problem z szyfrowaniem AES

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

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.

0

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

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
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

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