ฉันกำลังทำโปรเจ็กต์ที่ต้องส่งลิงก์การยืนยันให้กับผู้ใช้ เข้ารหัสชื่อผู้ใช้ของเขาโดยใช้การเข้ารหัส 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
จะถูกส่งเมื่อใดก็ตามที่มีสิ่งผิดปกติเกิดขึ้นกับอินพุตของอัลกอริทึม (คีย์หรือไซเฟอร์เท็กซ์ในกรณีของคุณ) คุณเปรียบเทียบผลลัพธ์ของการเข้ารหัส/ถอดรหัสฐาน 64 หรือไม่ คุณไม่ควรใช้คลาส Sun ภายใน ลองใช้ไลบรารี Bouncy Castle หรือ Apache แทน - person Maarten Bodewes   schedule 21.07.2012