ฉันชอบคิดว่าการเข้ารหัสเป็นโครงสร้างพื้นฐาน เราควรพยายามพัฒนาโครงสร้างพื้นฐานที่ลดจำนวนคำเตือนในการใช้งานให้น้อยที่สุดไม่ใช่หน้าที่ของการเข้ารหัสที่จะกำหนดว่าข้อความใดที่ "มีความหมาย" ในแอปพลิเคชันของคุณ คุณสามารถดูการชนที่เฉพาะเจาะจง $m_1, m_2$ และพูดด้วยความมั่นใจว่า ไม่ การประยุกต์ใช้ฟังก์ชันแฮชจะ เคย กำหนดความหมายให้กับสิ่งเหล่านี้ $m_1$ และ $m_2$?
ฟังก์ชันแฮชใดที่คุณควรใช้ ฟังก์ชันที่มีการรับประกัน "หายาก ใดๆ การชนกัน" หรือแบบที่มีการรับประกัน "เป็นการยากที่จะหาการชนกัน ยกเว้นบางครั้งในสตริงที่เป็น JPG ของเจอร์บิลและไฟล์ gzip ของเชคสเปียร์" ฉันไม่อยากขับรถที่มีสติกเกอร์เตือนว่า "รถอาจระเบิดถ้า คุณกำลังขับรถด้วยความเร็ว 88.1 ไมล์ต่อชั่วโมงโดยเปิดไฟเลี้ยวซ้ายและวิทยุปรับเป็น 88.1 FM แม้ว่าคำเตือนนั้นจะแคบลงก็ตาม และฉันจะไม่ทำ 3 อย่างพร้อมกัน
นั่นเป็นเหตุผลที่คำจำกัดความความปลอดภัยการเข้ารหัสพิจารณาการชนกัน ใดๆ สองข้อความที่ตอบสนอง $H(x_1) = H(x_2)$, การปลอมแปลงลายเซ็นบน ใดๆ ข้อความคือการโจมตี การเข้ารหัสของ ใดๆ ข้อความธรรมดาควรมีลักษณะที่แยกไม่ออก ฯลฯ หากคุณต้องการใช้การเข้ารหัสของคุณ ตรวจสอบให้แน่ใจว่าคุณพยายามรับประกันความปลอดภัยที่ทำให้ ทุกคน สบายใจ
เหตุผลประการที่สองที่ต้องกังวลเกี่ยวกับการชนกันแบบ "ไม่มีโครงสร้าง" $H$คือเมื่อพบแล้ว มักจะต้องใช้เวลาก่อนที่เทคนิคจะขยายออกไปเพื่อค้นหาการชนกันแบบ "มีโครงสร้าง" ตัวอย่างเช่น การค้นหาการชนที่มีโครงสร้างในฟังก์ชันสุ่ม (โดยใช้การโจมตีแบบคลาสสิกของ Yuval Collision Attack) มีความยากพอๆ กับการค้นหาการชนที่ไม่มีโครงสร้าง (โดยใช้กำลังเดรัจฉานมาตรฐานและขอบเขตวันเกิด)