@Billy_Milligan

Как исправить ошибку при расшифровке AES?

При расшифровке получаю ошибку.

javax.crypto.BadPaddingException: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad 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;
    }


Подскажите, как избавиться от ошибки?
  • Вопрос задан
  • 5539 просмотров
Решения вопроса 1
@Billy_Milligan Автор вопроса
Ошибка из-за OpenSSL начиная с android 4.2 и выше.

Проблема решается так.
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
MinimaJack
@MinimaJack
не тот пароль в расшифровке скорее всего...
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();
		}
	}

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы