ChaCha20 เป็นรหัสสตรีมและส่งออกสตรีม $O_i$ เพื่อเข้ารหัสข้อความเพื่อรับข้อความเข้ารหัส $$C_i = M_i\oplus O_i$$ การเข้ารหัสครั้งต่อไปของคุณจะเป็น $$C_i' = M_i\oplus O_i \oplus O_i'$$ ที่ไหน $O_i'$ เป็นเอาต์พุตของ ChaCha20 ตัวที่สองที่มีคีย์อื่น
สิ่งที่คุณถามคือการโจมตี ChaCha20 แบบไซเฟอร์เท็กซ์เท่านั้น ไม่มีใครสามารถทำได้สำหรับการเข้ารหัสแม้แต่ครั้งเดียว แต่ก็ยังไม่มีตัวแยกความแตกต่าง ผลลัพธ์ของ ChaCha20 เดียวนั้นดีพอจนไม่สามารถแยกความแตกต่างจากการสุ่มได้ ดังนั้น ผู้โจมตีสามารถเห็นข้อความที่เป็นไปได้ทั้งหมด ตราบใดที่พื้นที่ข้อความไม่สั้นหรือมีวิธีการตรวจสอบอื่น ๆ เช่นเซิร์ฟเวอร์ที่ทำหน้าที่เป็น Oracle
เนื่องจากตอนนี้พวกเขาได้รับผลลัพธ์ของการเข้ารหัสครั้งที่สองถึงครั้งสุดท้ายแล้ว (ไม่ใช่เนื้อหาดั้งเดิม) แล้วพวกเขาจะรู้ได้อย่างไรว่าทำสำเร็จ
การลบเลเยอร์นั้นไม่มีประโยชน์ตั้งแต่นั้นมา $$สุ่ม \oplus ข้อความ = สุ่ม$$ ดังนั้นจะไม่มีข้อมูลให้ตรวจสอบ
นี่ไม่ใช่ปัญหาที่แท้จริงของคุณ ปัญหาที่แท้จริงของคุณคือการจัดการคีย์ ระวังวิธีที่คุณสร้าง/รับมา และวิธีที่คุณจัดเก็บ/รับมา
การใช้ ChaCha20 เดียวที่มีคีย์ 256 บิตก็เพียงพอแล้วที่จะปลอดภัยจากศัตรูทั้งหมด (คลาสสิกหรือควอนตัม) ด้วยคีย์สุ่มที่เหมือนกัน หากคุณต้องการใช้การเข้ารหัสซ้ำซ้อน ให้รวมเข้ากับอัลกอริทึมการเข้ารหัสอื่น เช่น AES-GCM
โปรดทราบว่าการพิจารณาและการวิเคราะห์การเข้ารหัสหลายรายการ (เรียงซ้อน) เริ่มต้นจากการพิจารณาจุดอ่อนของ DES Ueli M. Maurer & James L. Massey ในปี 1993 แสดงใน Cascade Ciphers: ความสำคัญของการเป็นที่หนึ่ง นี้;
- โครงสร้างแบบคาสเคดมีความปลอดภัยเนื่องจากรหัสลับตัวแรก และไม่รับประกันความปลอดภัยที่มากกว่านี้ มีบล็อกโพสต์ของ Matthew Green เกี่ยวกับเรื่องนี้ การเข้ารหัสหลายรายการ ตามข้อสังเกตโดย SAI Peregrinus.
สำหรับรหัสสตรีม เรามีผลที่แตกต่างกัน (อีกครั้ง Maurer และ Massey);
- ข้อผิดพลาด 2 โมดูโลระดับบิต $2$ ผลรวมของ $n$ ลำดับคีย์สตรีมที่สร้างโดยอุปกรณ์ที่มีคีย์อิสระนั้นคาดเดาได้ยากพอๆ กับลำดับคีย์สตรีมที่คาดเดาได้ยากที่สุดเป็นอย่างน้อย