How to handle “last block incomplete in decryption”

泪湿孤枕 提交于 2019-11-30 08:46:49

I don't know if this is the problem with the IllegalBlockSizeException, but you should not encode the key as a String, especially without specifying the character encoding. If you want to do this, use something like Base-64, which is designed to encode any "binary" data, rather than a character encoding, which only maps certain bytes to characters.

The key is, in general, going to contain byte values that do not correspond to a character in the default platform encoding. In that case, when you create the String, the byte will be translated to the "replacement character", U+FFFD (�), and the correct value will be irretrievably lost.

Trying to use that corrupt String representation of the key later will prevent the plaintext from being recovered; it is possible it could cause the IllegalBlockSizeException, but I suspect an invalid padding exception would be more likely.

Another possibility is that the source platform and the target platform character encodings are different, and that "decoding" the ciphertext results in too few bytes. For example, the source encoding is UTF-8, and interprets two bytes in the input as a single character, while the target encoding is ISO-Latin-1, which represents that character as a single byte.

Your getKeySpec() method is wrong. You generate a new random key for both encrypt and decrypt directions. You have to use the same key for both. You should have noticed that you don't use the key argument to that method.

I was tearing my hair out over this, between "bad base 64" and "last block incomplete" errors ... to It is, of course, asymmetrical. Here's the essence how I ended up doing it which hopefully adds more to the discussion than if I attempted to explain:

public String crypto(SecretKey key, String inString, boolean decrypt){
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    byte[] inputByte = inString.getBytes("UTF-8");
    if (decrypt){
        cipher.init(Cipher.DECRYPT_MODE, key);
        return new String (cipher.doFinal(Base64.decode(inputByte, Base64.DEFAULT)));
    } else {
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return new String (Base64.encode(cipher.doFinal(inputByte), Base64.DEFAULT));
    }
}

If you are working on byte array then you must use same buffer size. For example, there is bytearray which size is 1000. After encryption, this size become 2000. (these not real value). If you use buffer to read all of encrypted file, then you should choose buffersize to 2000. I solved same problem with this way.

For me, i notice this problem when the data to be decrypted is corrupted (missing 1 character). It could have been due to the transmission of data over WiFi.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!