BadPaddingExeception при расшифровке AES256 - PullRequest
0 голосов
/ 21 сентября 2018

В настоящее время возникают проблемы с расшифровкой хэша AES.

Когда я шифрую с использованием AES256, я получаю следующий результат (после кодирования base64)

07sKQfb9dN86XAMxFmVKHQAAAAAAAAAAAAAAAAAAAAA=

Я считаю, что моя проблема связана сAAAAAAAA и т. д. по какой-то причине я думаю, что в любом случае заполнение не удаляется при расшифровке.

Мой код

public String encrypt(String key, String initVector, String value) throws Exception {
        IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"), 0, initVector.getBytes().length);
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), 0, key.getBytes().length, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

        byte[] encrypted = new byte[32];

        cipher.doFinal(value.getBytes(), 0, value.getBytes().length, encrypted, 0);

        System.out.println("Base64: " + Base64.encode(encrypted));
        System.out.println("Hex: " + bytesToHex(encrypted));

        return Base64.encode(encrypted);
}

public String decrypt(String key, String initVector, String encrypted) {
    try {
        IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"), 0, initVector.getBytes().length);
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), 0, key.getBytes().length, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

        byte[] decrypted = new byte[64];
        cipher.doFinal(Base64.decode(encrypted), 0, Base64.decode(encrypted).length, decrypted, 0);

        return new String(decrypted);
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return null;
}

Что я ожидаю, когда кодирую base64 07sKQfb9dN86XAMxFmVKHQ=

Строка, которую я шифрую: Тестовый секретный ключ: password12345678password12345678

1 Ответ

0 голосов
/ 21 сентября 2018
    byte[] decrypted = new byte[64];

вы создали 64-байтовый массив, но расшифрованное значение может быть короче (Java не использует терминатор нулевой строки в отличие от C).Поэтому не стоит делать предположения относительно длины параметра

, попробуйте использовать

encrypted = cipher.doFinal(value.getBytes());

и

decrypted = cipher.doFinal(Base64.decode(encrypted));
...