B
B
Billy Milligan2014-03-14 16:08:44
Java
Billy Milligan, 2014-03-14 16:08:44

How to fix AES decryption error?

I get an error while decrypting.

javax.crypto.BadPaddingException: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

I encrypt and decrypt.
private static byte[] password = null; //  this.password = editText.getBytes();
    static final byte[] ivBytes = {'6','g','6','o','d','a','0','u','4','n','w','i','6','9','i','j'};

    public static byte[] encrypt(String text) throws Exception {
        byte[] clear = text.getBytes("UTF-8");
        IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        sr.setSeed(password);
        kgen.init(256, sr); // 192 and 256 bits may not be available
        SecretKey skey = kgen.generateKey();
        byte[] key = skey.getEncoded();

        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
        byte[] encrypted = cipher.doFinal(clear);
        return encrypted;
    }

    public static String decrypt(byte[] encrypted) throws Exception {
        IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        sr.setSeed(password);
        kgen.init(256, sr); // 192 and 256 bits may not be available
        SecretKey skey = kgen.generateKey();
        byte[] key = skey.getEncoded();

        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
        String decrypted = new String(cipher.doFinal(encrypted));
        return decrypted;
    }

Tell me how to get rid of the error?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
B
Billy Milligan, 2014-03-16
@Billy_Milligan

Error due to OpenSSL since android 4.2 and above.
The problem is solved like this.

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");

M
MinimaJack, 2014-03-14
@MinimaJack

Wrong password in decryption most likely...

package custom;
import java.math.BigInteger;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Test {
  private static byte[] password = new String("password").getBytes(); // this.password =
                      // editText.getBytes();
  static final byte[] ivBytes = { '6', 'g', '6', 'o', 'd', 'a', '0', 'u',
      '4', 'n', 'w', 'i', '6', '9', 'i', 'j' };

  public static byte[] encrypt(String text) throws Exception {
    byte[] clear = text.getBytes("UTF-8");
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
    sr.setSeed(password);
    kgen.init(128, sr); // 192 and 256 bits may not be available
    SecretKey skey = kgen.generateKey();
    byte[] key = skey.getEncoded();

    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
    byte[] encrypted = cipher.doFinal(clear);
    return encrypted;
  }

  public static byte[] decrypt(byte[] encrypted) throws Exception {
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
    sr.setSeed(password);
    kgen.init(128 , sr); // 192 and 256 bits may not be available
    SecretKey skey = kgen.generateKey();
    byte[] key = skey.getEncoded();

    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
    return cipher.doFinal(encrypted);
  }

  public static void main(String[] args) {
    try {
      byte[] text = Test.encrypt("Test - тест - 123");
      System.out.println(String.format("%X", new BigInteger(1, text)));
      System.out.println(new String(Test.decrypt(text),"UTF-8") );
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question