Saya sedang mengerjakan proyek di mana saya perlu mengirimkan tautan verifikasi ke pengguna. Jadi dienkripsi nama penggunanya menggunakan enkripsi AES. Kode saya berfungsi dengan baik, yaitu enkripsi dan dekripsi berfungsi dengan baik tetapi hanya di program ketika saya mengujinya. Saya mengenkripsi string dan kemudian mendekripsinya. Ini berfungsi dengan baik 'secara lokal'.
Masalahnya adalah, ketika saya mengirim email dengan link aktivasi dan mengkliknya, saya mendapat error:
javax.crypto.BadPaddingException: Given final block not properly padded
Kode saya seperti yang ditunjukkan di bawah ini:
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
dilemparkan setiap kali ada yang salah dengan masukan algoritme (kunci atau teks sandi dalam kasus Anda). Apakah Anda membandingkan output dari pengkodean/dekode basis 64? Anda tidak boleh menggunakan kelas Sun internal, coba perpustakaan Bouncy Castle atau Apache sebagai gantinya. - person Maarten Bodewes   schedule 21.07.2012