Getting "EVP_DecryptFinal_ex:wrong final block length" during decryption

10,415

Encrypted username: [B@52aff408

Encrypted password: [B@52aff6d8

These are too small. Assuming the plain text message was fewer than 16 bytes, then these should be exactly 16 bytes because of PKCS padding.

You have an encoding problem somewhere. Probably an embedded null that slices off the end of the cipher text when interpreted as a string...

As a matter of fact, they look like pointers being printed....

Share:
10,415
dgzz
Author by

dgzz

Updated on June 19, 2022

Comments

  • dgzz
    dgzz almost 2 years

    I followed this tutorial for encrypting and decrypting simple strings in android/java:

    https://stackoverflow.com/questions/4319496/how-to-encrypt-and-decrypt-data-in-java I made a Cryptography class:

    public class Cryptography {
    
        public static SecretKey generateKey() throws NoSuchAlgorithmException {
            MessageDigest digest = MessageDigest.getInstance("SHA");
            digest.update("BhLKTyLoP YroUsRQT".getBytes());
            return new SecretKeySpec(digest.digest(), 0, 16, "AES");
        }
    
        public static byte[] encrypt(String message, SecretKey key) throws NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException {
            Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");
            aes.init(Cipher.ENCRYPT_MODE, key);
            return aes.doFinal(message.getBytes());
        }
    
        public static String decrypt(byte[] cipherText, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
            Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");
            aes.init(Cipher.DECRYPT_MODE, key);
            return new String(aes.doFinal(cipherText));
        }
    
    }
    

    I was able to encrypt method and gave me this:

    Encrypted username: [B@52aff408 
    Encrypted password: [B@52aff6d8
    

    However, when I use decrypt:

    SecretKey secret = Cryptography.generateKey();
    Log.d("encryption", "Decrypted username: " + Cryptography.decrypt(encryptedUsername.getBytes(),secret)
                                    + " Decrypted password: " +  Cryptography.decrypt(encyptedPassword.getBytes(),secret));
    

    It gives me the error:

    03-25 15:22:23.461    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ java.lang.RuntimeException: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
    03-25 15:22:23.461    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at org.apache.harmony.xnet.provider.jsse.NativeCrypto.EVP_CipherFinal_ex(Native Method)
    03-25 15:22:23.461    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at org.apache.harmony.xnet.provider.jsse.OpenSSLCipher.doFinalInternal(OpenSSLCipher.java:398)
    03-25 15:22:23.461    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at org.apache.harmony.xnet.provider.jsse.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:434)
    03-25 15:22:23.461    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at javax.crypto.Cipher.doFinal(Cipher.java:1111)
    03-25 15:22:23.461    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at com.sblive.utils.Cryptography.decrypt(Cryptography.java:28)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at com.sblive.aufschoolbliz.GradeBookFragment$2.onClick(GradeBookFragment.java:99)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.view.View.performClick(View.java:4240)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.view.View$PerformClick.run(View.java:17721)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:730)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5103)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525)
    03-25 15:22:23.465    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    03-25 15:22:23.469    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    03-25 15:22:23.469    2073-2073/com.sblive.aufschoolbliz W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
    
  • dgzz
    dgzz about 10 years
    oh yes, I was using String.valueOf when I'm storing it to shared preferences. However, I'm now getting unknown characters for the encryption, something like this: "�)��J;]�w.6�t"
  • jww
    jww about 10 years
    "now getting unknown characters for the encryption..." - you probably need a different strategy for the way you handle the raw bytes. Especially if you are trying to treat them like printable strings. You could Hex/Base32/Base64 encode them (and decode) them as required.