Subroutines: EVP_DecryptFinal_ex: wrong end block length in android

Actually, I work in an application and have a problem with AES decryption

I have an error in this line byte[] results = cipher.doFinal(Base64.encode(text.getBytes("UTF-8"), Base64.DEFAULT));

error : error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length

 String key = "grnR++15jgNFVmVg61UvQA=="; String data = "vrvwe+9wVhyNJmb/KcLD2K2j9gqkwVFXq0jt0qL7zyHHG2JWpkvr+VpG/QHm6INW01WsBZcpRYYk25bMtjWgLY6dzFNs3WLXZRMnVtIDhjuIfv0sp2RKvhjNLEu3Gscz4sdxYYS6XcLOWAY705Ll48+mA55Ke5WSq71jVR+TCJVT0w2nYZvzviE+N0QwRX5EZjCMjbaH4gpFLr+LsNevkAQ7e7Id4oSvrwqJ3PyUS4mo8OvPcUjKDhQCJc39k2aqBBaZ9O1AuqQqCOWpgy2XW9kacAP8zrcDRO7oNtSbIM0sqIyKS4PGzXiL+hw43hs33d/VO8tvLGHWOE0UvWkQY0QPJqzRDmmWpRTgr0Xt56UxIXjjAmteVlb+TWo3kzRSUQ2Un+ScCfEBHjaNJNShE27zSeXOjkMWpB0jobSMJy6KdR/fqopHmYcWd41DNOz25nkUtQBmBK+x5sqM0dLswL8TKfb7MdIdhqdZaHt7h1CTNpozEwg+A7ZEkcGZ3hcGAwPWkPrg1yoXE5uaeCzdslf4knbXBxIx8ekrBiyUY5BhMPak/7LJm9D64RPQEpdOUTeg2fh9nKShXnr1OdKGrf68H7c/rSincB2uqgEuo9oHaBIIwm0RuUkM/jCjeLmVEE2zIjJE2osk2XQKf4iOlHP12XQOCtITYBZm8jc0OKmjpelFaWNLFheAE/txRk/NSS+qmUcWor1BSXDZAxje0ftwTl0jYz69U3tW9pDm3yooWWU51ORoTpQHqEGLumQyJom3OfsSkQ/T/pEMxY6B3a7TmJ+8u+QJla+ZCHFav5aKL1Ojy7xijYzIlsoVP9m7nDp30oVA8rpI8vYKpUHXUuQPxdVV4/yjvCeRkWT/veQtHpA9OWYDSTQLdRYfOOeQoxg/kGua4HU0RlC8IVgm/iJJnpWJgvdKD0KKmVgwFKmZ1TFg5yMRN4oOPDk4yhtnjPV9VhJU4lHztHw7TG53UWblwieeorD+v94LHySXFAj1tyd4tebgrvFqyuPovT4iP7Xm37KA/LmtrCPiCaBn6g==; try { Decrypt(data,key); } catch (Exception e) { e.printStackTrace(); } KcLD2K2j9gqkwVFXq0jt0qL7zyHHG2JWpkvr + VpG / QHm6INW01WsBZcpRYYk25bMtjWgLY6dzFNs3WLXZRMnVtIDhjuIfv0sp2RKvhjNLEu3Gscz4sdxYYS6XcLOWAY705Ll48 + mA55Ke5WSq71jVR + TCJVT0w2nYZvzviE + N0QwRX5EZjCMjbaH4gpFLr + LsNevkAQ7e7Id4oSvrwqJ3PyUS4mo8OvPcUjKDhQCJc39k2aqBBaZ9O1AuqQqCOWpgy2XW9kacAP8zrcDRO7oNtSbIM0sqIyKS4PGzXiL + hw43hs33d / VO8tvLGHWOE0UvWkQY0QPJqzRDmmWpRTgr0Xt56UxIXjjAmteVlb + TWo3kzRSUQ2Un + ScCfEBHjaNJNShE27zSeXOjkMWpB0jobSMJy6KdR / fqopHmYcWd41DNOz25nkUtQBmBK + x5sqM0dLswL8TKfb7MdIdhqdZaHt7h1CTNpozEwg + A7ZEkcGZ3hcGAwPWkPrg1yoXE5uaeCzdslf4knbXBxIx8ekrBiyUY5BhMPak / 7LJm9D64RPQEpdOUTeg2fh9nKShXnr1OdKGrf68H7c / rSincB2uqgEuo9oHaBIIwm0RuUkM / jCjeLmVEE2zIjJE2osk2XQKf4iOlHP12XQOCtITYBZm8jc0OKmjpelFaWNLFheAE / txRk / NSS + qmUcWor1BSXDZAxje0ftwTl0jYz69U3tW9pDm3yooWWU51ORoTpQHqEGLumQyJom3OfsSkQ / T / String key = "grnR++15jgNFVmVg61UvQA=="; String data = "vrvwe+9wVhyNJmb/KcLD2K2j9gqkwVFXq0jt0qL7zyHHG2JWpkvr+VpG/QHm6INW01WsBZcpRYYk25bMtjWgLY6dzFNs3WLXZRMnVtIDhjuIfv0sp2RKvhjNLEu3Gscz4sdxYYS6XcLOWAY705Ll48+mA55Ke5WSq71jVR+TCJVT0w2nYZvzviE+N0QwRX5EZjCMjbaH4gpFLr+LsNevkAQ7e7Id4oSvrwqJ3PyUS4mo8OvPcUjKDhQCJc39k2aqBBaZ9O1AuqQqCOWpgy2XW9kacAP8zrcDRO7oNtSbIM0sqIyKS4PGzXiL+hw43hs33d/VO8tvLGHWOE0UvWkQY0QPJqzRDmmWpRTgr0Xt56UxIXjjAmteVlb+TWo3kzRSUQ2Un+ScCfEBHjaNJNShE27zSeXOjkMWpB0jobSMJy6KdR/fqopHmYcWd41DNOz25nkUtQBmBK+x5sqM0dLswL8TKfb7MdIdhqdZaHt7h1CTNpozEwg+A7ZEkcGZ3hcGAwPWkPrg1yoXE5uaeCzdslf4knbXBxIx8ekrBiyUY5BhMPak/7LJm9D64RPQEpdOUTeg2fh9nKShXnr1OdKGrf68H7c/rSincB2uqgEuo9oHaBIIwm0RuUkM/jCjeLmVEE2zIjJE2osk2XQKf4iOlHP12XQOCtITYBZm8jc0OKmjpelFaWNLFheAE/txRk/NSS+qmUcWor1BSXDZAxje0ftwTl0jYz69U3tW9pDm3yooWWU51ORoTpQHqEGLumQyJom3OfsSkQ/T/pEMxY6B3a7TmJ+8u+QJla+ZCHFav5aKL1Ojy7xijYzIlsoVP9m7nDp30oVA8rpI8vYKpUHXUuQPxdVV4/yjvCeRkWT/veQtHpA9OWYDSTQLdRYfOOeQoxg/kGua4HU0RlC8IVgm/iJJnpWJgvdKD0KKmVgwFKmZ1TFg5yMRN4oOPDk4yhtnjPV9VhJU4lHztHw7TG53UWblwieeorD+v94LHySXFAj1tyd4tebgrvFqyuPovT4iP7Xm37KA/LmtrCPiCaBn6g==; try { Decrypt(data,key); } catch (Exception e) { e.printStackTrace(); } yjvCeRkWT / veQtHpA9OWYDSTQLdRYfOOeQoxg / kGua4HU0RlC8IVgm / iJJnpWJgvdKD0KKmVgwFKmZ1TFg5yMRN4oOPDk4yhtnjPV9VhJU4lHztHw7TG53UWblw String key = "grnR++15jgNFVmVg61UvQA=="; String data = "vrvwe+9wVhyNJmb/KcLD2K2j9gqkwVFXq0jt0qL7zyHHG2JWpkvr+VpG/QHm6INW01WsBZcpRYYk25bMtjWgLY6dzFNs3WLXZRMnVtIDhjuIfv0sp2RKvhjNLEu3Gscz4sdxYYS6XcLOWAY705Ll48+mA55Ke5WSq71jVR+TCJVT0w2nYZvzviE+N0QwRX5EZjCMjbaH4gpFLr+LsNevkAQ7e7Id4oSvrwqJ3PyUS4mo8OvPcUjKDhQCJc39k2aqBBaZ9O1AuqQqCOWpgy2XW9kacAP8zrcDRO7oNtSbIM0sqIyKS4PGzXiL+hw43hs33d/VO8tvLGHWOE0UvWkQY0QPJqzRDmmWpRTgr0Xt56UxIXjjAmteVlb+TWo3kzRSUQ2Un+ScCfEBHjaNJNShE27zSeXOjkMWpB0jobSMJy6KdR/fqopHmYcWd41DNOz25nkUtQBmBK+x5sqM0dLswL8TKfb7MdIdhqdZaHt7h1CTNpozEwg+A7ZEkcGZ3hcGAwPWkPrg1yoXE5uaeCzdslf4knbXBxIx8ekrBiyUY5BhMPak/7LJm9D64RPQEpdOUTeg2fh9nKShXnr1OdKGrf68H7c/rSincB2uqgEuo9oHaBIIwm0RuUkM/jCjeLmVEE2zIjJE2osk2XQKf4iOlHP12XQOCtITYBZm8jc0OKmjpelFaWNLFheAE/txRk/NSS+qmUcWor1BSXDZAxje0ftwTl0jYz69U3tW9pDm3yooWWU51ORoTpQHqEGLumQyJom3OfsSkQ/T/pEMxY6B3a7TmJ+8u+QJla+ZCHFav5aKL1Ojy7xijYzIlsoVP9m7nDp30oVA8rpI8vYKpUHXUuQPxdVV4/yjvCeRkWT/veQtHpA9OWYDSTQLdRYfOOeQoxg/kGua4HU0RlC8IVgm/iJJnpWJgvdKD0KKmVgwFKmZ1TFg5yMRN4oOPDk4yhtnjPV9VhJU4lHztHw7TG53UWblwieeorD+v94LHySXFAj1tyd4tebgrvFqyuPovT4iP7Xm37KA/LmtrCPiCaBn6g==; try { Decrypt(data,key); } catch (Exception e) { e.printStackTrace(); } 

Method

 String Decrypt(String text, String key) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); byte[] keyBytes = Base64.decode(key.getBytes(), Base64.DEFAULT); SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); byte[] b = new byte[keySpec.getEncoded().length]; System.arraycopy(keySpec.getEncoded(), 0, b, 0, b.length); IvParameterSpec ivSpec = new IvParameterSpec(b); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] results = cipher.doFinal(Base64.encode(text.getBytes("UTF-8"), Base64.DEFAULT)); String decoded = new String(cipher.doFinal(results), "UTF-8"); return decoded; } 
+5
source share
2 answers

I started a new story about how your decryption procedure works. Take a look at the example below. I made some assumptions regarding your key and data fields, which you will see in the code. It is important that you understand where these fields come from and their format. This code has been tested and works as a demo.

Comments should help you get through.

As for the error you see, this means that your encrypted string does not match the length. Since it seems to be padded, it should be a multiple of 16 bytes (this is not the case), which is the size of the AES block. The line you give does not have a trailing quote, so it won’t compile anyway. It is hard to say what exactly happened with the encrypted string.

The initialization vector is not configured correctly. Iv is independent of the key; it is separately displayed during encryption and is β€œdata” during decryption. See how the initialization vector is configured in the following procedure.

Hope this helps.

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { final String SECRET_KEY = "PloasdlOoasdllasiewjsaroo9o55ooo"; // 256 bits // encryptedString is encrypted form of the string "This is just some test data." It has // the initialization vector added as a prefix. final String encryptedString = "yDdtrKCl30b+fndIMkhasDhBNk+OGYqiM6uVVF89pu2WSnjMsz1lnw6x4H23QWxP"; String decryptedString; super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { decryptedString = doDecryption(encryptedString, SECRET_KEY); } catch (Exception e) { decryptedString = "Error doing decryption!"; e.printStackTrace(); } Log.d(TAG, ">>Decrypted string=" + decryptedString); } /** * Decrypt from Base 64 representation of a string with initialization vector prefix. * * @param sourceBase64 Initialization vector prefixed to string to decrypt in base 64. * @param secretKey The secret key used to do the encryption and the decryption. * @return The decrypted string. * @throws Exception Exception */ String doDecryption(String sourceBase64, String secretKey) throws Exception { Cipher cipher; // The cipher used to encrypt and decrypt int cipherBlockSize; // Size of the cipher block byte[] sourceBytes; // Decoded byte array from sourceBase64 byte[] iv; // Initialization vector byte[] bytesToDecrypt; // Bytes on which to perform decryption // String passed in is in base 64. Translate so we can work with it. sourceBytes = Base64.decode(sourceBase64.getBytes("UTF-8"), Base64.DEFAULT); // Get the secretKey spec for our secret key to work with our cipher. SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES"); // Set up the cipher. cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipherBlockSize = cipher.getBlockSize(); // The initialization vector prefixes the string that was passed in (sourceBase64). // The length of this initialization vector is the same as our cipher blocksize. iv = new byte[cipherBlockSize]; // Split the inititializatoin vector from the bytes we need to decrypt. bytesToDecrypt = new byte[sourceBytes.length - cipherBlockSize]; System.arraycopy(sourceBytes, 0, iv, 0, iv.length); System.arraycopy(sourceBytes, iv.length, bytesToDecrypt, 0, bytesToDecrypt.length); // Now do the actual decryption. cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv)); return new String(cipher.doFinal(bytesToDecrypt)); } private static final String TAG = "MainActivity"; } 
+3
source

I think the problem is in this line:

 byte[] results = cipher.doFinal(Base64.encode(text.getBytes("UTF-8"), Base64.DEFAULT)); 

It seems you are encoding base64 which is already base64 encoded. I think you should change it for the following code:

 String decoded = new String(cipher.doFinal(Base64Coder.decode(text)), "UTF-8"); 
+1
source

Source: https://habr.com/ru/post/1266448/


All Articles