javax.crypto.BadPaddingException: учитывая, что последний блок не заполнен должным образом... попытался использовать getbytes("UTF")

Я попытался добавить getbytes("UTF") или getbytes("UTF-8"), так как это было предложено в аналогичном вопросе. Он сказал, что нам нужно попробовать UTF при преобразовании байтов в строку и наоборот. Но все равно это не работает для моего кода... пожалуйста, помогите

public class Password1 {

    private static final String ALGO = "AES";
    private static byte[] keyValue = new byte[]{'t','h','y','u','e','f','z','s','y','k','f','l','d','a','b','m'};

    public static void main(String[] args) {
        //Password1 p = new Password1();
        Scanner sc = new Scanner(System.in);
        String i = sc.nextLine();
        System.out.println("Password = "+i);

        try {
            String en = encrypt(i);
            System.out.println(en);
            String dec = decrypt(en);

            System.out.println("Encrypted = " + en);
            System.out.println("Decrypted = " + dec);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static String encrypt(String Data) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(Data.getBytes("UTF-8"));
        String encrypted = new BASE64Encoder().encode(encVal);

        return encrypted;
    }

    public static String decrypt(String encrypted) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);
        //Byte bencrypted = Byte.valueOf(encrypted);
        byte[] decoded = new BASE64Decoder().decodeBuffer(encrypted);

        byte[] decValue = c.doFinal(decoded);
        String decrypted = new String(decValue);
        return decrypted;
    }

    private static Key generateKey() throws Exception {
        MessageDigest sha = MessageDigest.getInstance("SHA-1");
        keyValue = sha.digest(keyValue);
        keyValue = Arrays.copyOf(keyValue, 16);
        SecretKeySpec key = new SecretKeySpec(keyValue, ALGO);
        return key;
    }

}

2 ответа

Решение

Когда вы звоните encrypt() Вы заменяете пароль на его хеш, а затем используете хеш в качестве ключа.

Тогда вы звоните decrypt()и перефразируйте хеш, и используйте хешированный хеш в качестве ключа. Таким образом, вы не используете один и тот же ключ для шифрования и дешифрования.

Сгенерируйте ключ один раз в main()и передать его в качестве параметра encrypt() а также decrypt(), Делать keyValue окончательный. Или даже лучше, сделать его локальной переменной main,

На линии, где у вас есть Cipher.getInstance(ALGO) иметь свой ALGO переменная быть "AES/CBC/PKCS5Padding" (или любой другой режим и отступы, которые вы хотите использовать). Это должно решить любые проблемы с заполнением, с которыми вы можете столкнуться, подобно тому, как вы сейчас.

Если вы не сделаете это таким образом, я верю, что вам придется самостоятельно обрабатывать всю логику заполнения.

Ответ Б.Б. Низета о том, как вы генерируете ключи, является другой половиной вашей проблемы.

Другие вопросы по тегам