จะปลอดภัยหรือไม่หากฉันใช้รหัสเดียวกันสำหรับข้อความที่แตกต่างกัน
แน่นอน; มันจะไม่ใช่ MAC ที่ดีนักหากสามารถใช้รหัสสำหรับข้อความเดียวได้
และเหตุใดฉันจึงต้องมี IV สำหรับ GMAC
เนื่องจาก CMAC และ GMAC มีโครงสร้างภายในที่แตกต่างกัน
ด้วย CMAC สิ่งที่คุณทำส่วนใหญ่จะเป็นการคำนวณแบบเดียวกับการเข้ารหัสโหมด CBC ยกเว้นว่าคุณเก็บเฉพาะบล็อกสุดท้าย (และนั่นคือ MAC) ฉันพูดเป็นส่วนใหญ่เพราะถ้าคุณเพียงแค่ดำเนินการนี้ (ซึ่งเรียกว่า CBCMAC) สิ่งนี้จะทำให้ผู้โจมตีสามารถเล่นเกมบางเกมโดยขยายข้อความ - เพื่อป้องกันไม่ให้ CMAC xor อยู่ในข้อมูลลับบางส่วนพร้อมบล็อกสุดท้าย ทำลายเกมดังกล่าว .
เหตุผลที่เราขอให้ IV แตกต่าง (และคาดเดาไม่ได้) ในโหมด CBC ก็เพื่อบล็อกเริ่มต้นจะไม่รั่วไหลของข้อมูล CMAC ไม่ส่งออกบล็อกโหมด CBC เริ่มต้น (เว้นแต่ว่าข้อความจะอยู่ในบล็อกเดียว และแม้ว่าจะเป็นเช่นนั้น xor ของข้อมูลลับจะป้องกันการรั่วไหลดังกล่าว) ดังนั้น CMAC จึงไม่แสดงความกังวลเกี่ยวกับ IV
สำหรับ GMAC นั่นแตกต่างไปจากเดิมอย่างสิ้นเชิง ด้วยวิธีนี้ คุณจะแปลงข้อความเป็นค่าสัมประสิทธิ์ของพหุนามอย่างมีเหตุผล $M_k, M_{k-1}, ..., M_1$; จากนั้นคุณก็แปลงค่า IV เป็นค่าคงที่ $M_0$ ในรหัสลับ แล้วประเมินพหุนาม (ในเขตข้อมูลจำกัด) ที่จุดลับ $H$นั่นคือคุณคำนวณ:
$$M_kH^k + M_{k-1}H^{k-1} + ... + M_1 H^1 + M_0$$
และนั่นคือ MAC โปรดทราบว่าผู้โจมตีรู้ทุกอย่าง ยกเว้นค่าความลับ $H$ (ซึ่งเป็นค่าคงที่สำหรับคีย์ที่กำหนด) และ $M_0$ (และหลังขึ้นอยู่กับ IV)
ตอนนี้ หากคุณมี MAC สองเครื่องสำหรับสองข้อความที่แตกต่างกันโดยมี IV เดียวกัน $M_0$ ค่าจะเหมือนกัน คุณสามารถลบพวกมันออกแล้วแก้หา $H$ - ที่ให้ความลับทั้งหมดแก่คุณ และเพื่อให้คุณสามารถสร้างข้อความที่มีค่า MAC ที่ถูกต้องได้ตามต้องการ
และในระดับที่ค่อนข้างสูงที่ฉันอธิบายไว้ Poly1305 ก็ทำงานในลักษณะเดียวกัน (และมีจุดอ่อนเดียวกันสำหรับการทำซ้ำ IV)
ในกรณีของฉัน ฉันไม่ได้เข้ารหัสข้อความใดๆ ฉันแค่สร้าง MAC ที่ฉันแนบไปกับข้อความ (ข้อความธรรมดา) สิ่งนี้มีช่องโหว่หรือไม่?
MAC ที่ดีก็ใช้ได้ - นั่นคือกรณีการใช้งานจริง ๆ ที่ MAC ควรจะกล่าวถึง [1] CMAC นั้นใช้ได้ - GMAC และ Poly1305 ก็ใช้ได้เช่นกันหากคุณหลีกเลี่ยงการให้ IV ซ้ำ
[1]: แน่นอนว่าสมมติว่าผู้ส่งและผู้รับใช้รหัสลับเดียวกัน - หากคุณต้องการบางอย่างที่ผู้รับไม่สามารถสร้างข้อความที่ดูถูกต้องได้ คุณจะต้องดูที่ลายเซ็น