Исключение неправильного заполнения в AES

Я работаю над проектом, в котором мне нужно отправить ссылку для подтверждения пользователю. Поэтому зашифровал свое имя пользователя с помощью шифрования AES. Мой код работает нормально, т.е. шифрование и расшифровка работают нормально, но только в программе, когда я ее тестировал. Я зашифровал строку, а затем расшифровал ее. Он отлично работает «локально».

Проблема в том, что когда я отправляю электронное письмо со ссылкой для активации и нажимаю на нее, появляется ошибка:

javax.crypto.BadPaddingException: Given final block not properly padded

Мой код показан ниже:

public class AES {

private static final String algo="AES";
private static final byte[] keyValue= 
        new byte[]{somekey};

private static Key generateKey() throws Exception{

    Key key= new SecretKeySpec(keyValue, algo);

    return key;
}

public static String encrypt(String  email) throws Exception{

    Key key=generateKey();
    Cipher c=Cipher.getInstance(algo);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal=c.doFinal(email.getBytes());
    String encryptedEmail= new BASE64Encoder().encode(encVal);

    return encryptedEmail;
}

public static String decrypt(String encryptedEmail) throws Exception{

    Key key=generateKey();
    Cipher c=Cipher.getInstance(algo);
    c.init(Cipher.DECRYPT_MODE, key);

    byte[] decodeEmail= new BASE64Decoder().decodeBuffer(encryptedEmail);
    byte[] decodedEmail=c.doFinal(decodeEmail);

    String decryptedEmail= new String(decodedEmail);

    return decryptedEmail;
    }

}


person kunal18    schedule 21.07.2012    source источник
comment
Есть ли кто-нибудь, кто поможет мне? Пожалуйста, это срочно!   -  person kunal18    schedule 21.07.2012
comment
BadPaddingException выдается всякий раз, когда что-то не так с вводом алгоритма (ключ или зашифрованный текст в вашем случае). Вы сравнивали вывод кодирования/декодирования base 64? Вы не должны использовать внутренние классы Sun, вместо этого попробуйте библиотеки Bouncy Castle или Apache.   -  person Maarten Bodewes    schedule 21.07.2012
comment
Вы решили проблему? Если да, не могли бы вы указать, что сделали, и либо принять, либо опубликовать ответ?   -  person Maarten Bodewes    schedule 30.07.2012


Ответы (2)


Я заставил его работать, используя кодировщик/декодер Base64 библиотек Bouncy Castle, никаких проблем. Проверьте свой ввод/вывод и используйте действительный кодировщик/декодер base 64, а не внутренний Sun с неопределенным вводом/выводом.

Предупреждение: поскольку вы используете неуказанную кодировку символов, она будет использовать специфичную для платформы кодировку, поэтому ваш ввод/вывод может отличаться в разных системах. Попробуйте использовать Charset.forName("UTF8") для наиболее совместимой кодировки символов (в конструкторе String и методе toBytes).

person Maarten Bodewes    schedule 21.07.2012
comment
Я бы поставил на кодировку символов как на проблему. - person President James K. Polk; 21.07.2012
comment
@GregS, может быть, строка base64 не передается должным образом, иначе преобразование может завершиться неудачно, но это будет после расшифровки - person Maarten Bodewes; 21.07.2012

Похоже, ваш код не устанавливает заполнение ни для шифрования, ни для расшифровки. Гораздо лучше явно установить отступы на обоих концах. Вы также, похоже, не устанавливаете режим, опять же, это нужно сделать явно.

Я бы предложил «AES/CBC/PKCS5Padding» как очевидный выбор.

person rossum    schedule 21.07.2012
comment
Все очень верно, но поскольку AES/ECB/PKCS5Padding используется по умолчанию, это не является ответом. - person Maarten Bodewes; 21.07.2012
comment
Режим ECB небезопасен, избегайте его. CBC или CTR безопасны. Используйте GCM, если вам нужна аутентификация. На значения по умолчанию лучше не полагаться, это может привести к ошибкам. Каково значение по умолчанию на принимающей стороне? - person rossum; 21.07.2012
comment
Я думаю, что принимающая сторона включена в код (указаны как шифрование, так и дешифрование); проблема в том, что код действительно работает нормально. Примечание: я не автор вопроса. - person Maarten Bodewes; 21.07.2012
comment
Да, код работает нормально. Я имею в виду, что он работает нормально, когда я запускаю main(). Я передаю строку, отображаю ее после шифрования, а затем снова отображаю после расшифровки. Все нормально до этого. Но когда я отправляю электронное письмо, содержащее ссылку с зашифрованной строкой в ​​качестве параметра, я получаю исключение при посещении ссылки. - person kunal18; 22.07.2012
comment
Вы расшифровываете электронную почту на той же машине или на другой машине? Вы проверили, что полученное зашифрованное электронное письмо байт в байт совпадает с отправленным вами электронным письмом? - person rossum; 23.07.2012