ฉันเชื่อว่าฉันพบการใช้งาน AES-CFB8 ที่ไม่ปลอดภัยในแอปพลิเคชันที่ฉันกำลังทำงานอยู่ และหวังว่าจะมีคนอธิบายได้ว่าทำไมสิ่งนี้ถึงไม่ปลอดภัย และสิ่งที่ผู้โจมตีสามารถทำได้ เช่น การกู้คืนคีย์ ซึ่งจะเป็นผลลัพธ์ที่แย่กว่าสำหรับโปรโตคอลนี้ .
โดยทั่วไป AES-CFB8 (โดยชัดแจ้งโดยไม่มีการเติม) ใช้ในการเข้ารหัสสตรีมข้อมูลและ IV/คีย์จะถูกใช้ซ้ำระหว่างสตรีมเซิร์ฟเวอร์และไคลเอ็นต์ และ IV เหมือนกับคีย์ สิ่งนี้ไม่ปลอดภัยเพียงใด และเป็นไปได้หรือไม่ที่การโจมตีจะกู้คืน iv/key จากสิ่งนี้ คีย์ที่ใช้สำหรับ AES เป็นความลับที่ใช้ร่วมกันซึ่งอาจประนีประนอมได้มากกว่าแค่สตรีมแพ็กเก็ตดั้งเดิม เนื่องจากสตรีมที่มีการใช้งานที่ปลอดภัยที่เป็นไปได้นี้ไม่ละเอียดอ่อนเท่า แต่จะเป็นปัญหาที่ใหญ่กว่าหากคีย์ที่ใช้ถูกบุกรุก
SecretKey แบบคงที่สาธารณะ createSharedSecret () {
สุดท้าย KeyGenerator gen = KeyGenerator.getInstance ("AES");
gen.init (128); // AES-128
กลับ gen.generateKey();
}
// ตัดสินใจโดยไคลเอนต์และส่งอย่างปลอดภัยไปยังเซิร์ฟเวอร์ผ่าน RSA และตรวจสอบผ่านแหล่งที่เชื่อถือได้
SecretKey สุดท้าย sharedSecret = createSharedSecret ();
// ดำเนินการทั้งบนเซิร์ฟเวอร์และไคลเอนต์หลังจากเซิร์ฟเวอร์ได้รับความลับที่ใช้ร่วมกัน
รหัสสุดท้าย aesCFBEncrypt = Cipher.getInstance ("AES/CFB8/NoPadding");
aesCFBEncrypt.init (Cipher.ENCRYPT_MODE, sharedSecret, IvParameterSpec ใหม่ (sharedSecret.getEncoded ()));
รหัสสุดท้าย aesCFBDecrypt = Cipher.getInstance ("AES/CFB8/NoPadding");
aesCFBDecrypt.init (Cipher.DECRYPT_MODE, sharedSecret, IvParameterSpec ใหม่ (sharedSecret.getEncoded ()));
this.enableStreamEncryption (aesCFBEncrypt, aesCFBDecrypt);
ฉันได้ตรวจสอบปัญหาที่คล้ายกันแล้ว แต่ไม่มีสิ่งใดที่ฉันพบว่าเหมาะสมกับเกณฑ์ที่ฉันสนใจ นั่นคือการใช้รหัสเป็นสตรีมที่มีอินสแตนซ์ที่แตกต่างกันสำหรับ RX/TX บนไคลเอนต์และเซิร์ฟเวอร์และการใช้คีย์เป็น iv โดยไม่มีความแตกต่าง คีย์สำหรับเซิร์ฟเวอร์และไคลเอ็นต์