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


คำตอบ (2)


ฉันทำให้มันทำงานโดยใช้ตัวเข้ารหัส/ตัวถอดรหัส Base64 ของไลบรารี Bouncy Castle ได้ ไม่มีปัญหาเลย ตรวจสอบอินพุต/เอาท์พุตของคุณ และใช้ตัวเข้ารหัส/ตัวถอดรหัสฐาน 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