การถอดรหัส Java มีข้อยกเว้น

นี่คือวิธีการเข้ารหัสของฉัน (ค่าคือพารามิเตอร์อินพุต):

 byte key_bytes[] = "12345678".getBytes();
 SecretKeySpec _keyspec = new SecretKeySpec(key_bytes, "DES");
 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // Yes, I know I shouldn't use DES
 cipher.init(Cipher.ENCRYPT_MODE, _keyspec);

 byte[] utf8 = value.getBytes("UTF8");
 byte[] enc = cipher.doFinal(utf8);   // Encrypt

 String encrypted = new String(new Base64().encode(enc));

 return URLEncoder.encode(encrypted, "UTF-8");

นี่คือวิธีการถอดรหัสของฉัน (ค่าคือพารามิเตอร์อินพุต):

byte key_bytes[] = "12345678".getBytes();
SecretKeySpec _keyspec = new SecretKeySpec(key_bytes, "DES");
Cipher dcipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, _keyspec);

byte[] dec = new Base64().decode(value);
byte[] utf8 = dcipher.doFinal(dec);  // Decrypt, throws exception
return new String(utf8, "UTF8");

และฉันได้รับข้อยกเว้น:

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher

ฉันได้อ่านหัวข้อต่างๆ ดังนั้นฉันจึงพบว่าข้อยกเว้นนี้เกิดขึ้นเมื่อไม่มีช่องว่างภายในและมีโหมดการเข้ารหัสอื่น แล้วมีอะไรผิดปกติ?


person John Smith    schedule 17.07.2014    source แหล่งที่มา
comment
URLDecoderของคุณอยู่ที่ไหน? และส่วนใหญ่จะเกิดขึ้นหากไซเฟอร์เท็กซ์ของคุณไม่ได้มีขนาดบล็อกเป็นทวีคูณ (8 สำหรับ DES) อีกต่อไป   -  person Maarten Bodewes    schedule 17.07.2014
comment
โปรดทราบว่าการใช้ DES นั้นไม่ปลอดภัย ECB นั้นไม่ปลอดภัย และการส่งไซเฟอร์เท็กซ์โดยไม่มีแท็กการรับรองความถูกต้อง (HMAC) ผ่านเครือข่ายก็ไม่ปลอดภัยเช่นกัน   -  person Maarten Bodewes    schedule 18.07.2014
comment
ฉันบอกว่า DES นั้นไม่ปลอดภัย ECB นั้นไม่ปลอดภัย แต่ข้อกำหนดก็คือข้อกำหนด   -  person John Smith    schedule 18.07.2014
comment
@JohnSmith ตรวจสอบคำตอบและความคิดเห็นที่อัปเดตของฉันอีกครั้ง   -  person Wundwin Born    schedule 18.07.2014
comment
@owlstead คุณช่วยยกตัวอย่างการใช้ HMAC กับการเข้ารหัสประเภทนี้ได้ไหม   -  person John Smith    schedule 18.07.2014
comment
คุณใช้คีย์ที่แตกต่างออกไปสำหรับการคำนวณ HMAC จากนั้นคำนวณ HMAC ผ่านไซเฟอร์เท็กซ์ และ - หากใช้ - IV และพารามิเตอร์การเข้ารหัสที่กำหนดค่าได้อื่นๆ ที่จะถูกส่ง จากนั้นคุณตรวจสอบ HMAC ก่อน ถอดรหัส แค่นั้นแหละจริงๆ   -  person Maarten Bodewes    schedule 18.07.2014
comment
@owlstead ขอบคุณสำหรับคำแนะนำของคุณ ฉันจะจำไว้   -  person John Smith    schedule 23.07.2014


คำตอบ (2)


ตามที่สแต็กข้อยกเว้นกล่าวไว้ ความยาวต้องเป็นจำนวนเท่าของ 8

ดังนั้น ความยาว 8, 16, 24,... ใช้ได้กับ คีย์ไบต์

ลองด้วยความยาว 8 (12345678)

byte key_bytes[] = "12345678".getBytes();

หากยังคงมีข้อผิดพลาดอยู่ คุณสามารถปฏิบัติตาม ตอบ

อัปเดตแล้ว

หากคุณต้องการใช้ URLDecoder ลองใช้รหัสนี้ในวิธีการถอดรหัสของคุณ

String decryptd = URLDecoder.decode(value, "UTF-8");
byte[] dec = new Base64().decode(decryptd);
byte[] utf8 = dcipher.doFinal(dec);  
return new String(utf8, "UTF-8");
person Wundwin Born    schedule 17.07.2014
comment
ขออภัย ฉันได้แก้ไขคำถามแล้ว โดยแหล่งที่มามีความยาว 8 ตัวอักษร - person John Smith; 17.07.2014
comment
@JohnSmith คุณอาจต้องไปตามลิงก์ในคำตอบที่อัปเดต - person Wundwin Born; 17.07.2014
comment
ฉันไม่เห็นความแตกต่างใดๆ มีเพียงมาตรฐานการเข้ารหัสและการเข้ารหัส/ถอดรหัส UTF-8 ที่ใช้ในโค้ดของฉัน - person John Smith; 18.07.2014
comment
@JohnSmith ปัญหาอยู่ในวิธีการเข้ารหัสของคุณหากคุณส่งคืน encrypted string แทนที่จะเป็น return URLEncoder.encode(encrypted, "UTF-8"); ทุกอย่างจะเรียบร้อย - person Wundwin Born; 18.07.2014
comment
ใช่ มันช่วยได้ ขอบคุณ! - person John Smith; 18.07.2014

คุณขาด URLDecoder ในวิธีการถอดรหัสของคุณ โปรดทราบว่าหากสตริงถูกบุกรุกด้วยวิธีอื่น และความยาวไม่เท่ากับขนาดบล็อกอีกต่อไป คุณจะได้รับข้อยกเว้นนี้สำหรับทั้งโหมดการทำงานของ ECB และ CBC

person Maarten Bodewes    schedule 17.07.2014
comment
ฉันใช้ตัวเข้ารหัส Base64 ของ apache URL ถูกถอดรหัสด้านบนด้วยวิธีอื่น ดังนั้นค่าในอินพุตจึงถูกถอดรหัสแล้ว - person John Smith; 17.07.2014
comment
ทำงานบนระบบของฉันเป็นอย่างอื่น ตรวจสอบว่าสตริงที่ได้รับคือสตริงที่ส่ง! โปรดทราบว่านี่คือเหตุผลที่คุณควรสร้าง SSCCE! - person Maarten Bodewes; 17.07.2014
comment
สตริงที่ฉันได้รับจากเอาต์พุตของวิธีการเข้ารหัสเท่ากับสตริงซึ่งกำหนดให้เป็นอินพุตในการถอดรหัส - person John Smith; 18.07.2014
comment
คุณช่วยแสดงตัวอย่างสตริงอินพุตที่ใช้สำหรับการถอดรหัสที่ล้มเหลวด้วยข้อยกเว้นนี้ได้ไหม ควรแก้ไขเป็นคำตอบและตอบกลับว่าคุณทำที่นี่ - person Maarten Bodewes; 18.07.2014