Я работаю над проектом, в котором мне нужно отправить ссылку для подтверждения пользователю. Поэтому зашифровал свое имя пользователя с помощью шифрования 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;
}
}
BadPaddingException
выдается всякий раз, когда что-то не так с вводом алгоритма (ключ или зашифрованный текст в вашем случае). Вы сравнивали вывод кодирования/декодирования base 64? Вы не должны использовать внутренние классы Sun, вместо этого попробуйте библиотеки Bouncy Castle или Apache. - person Maarten Bodewes   schedule 21.07.2012