ความท้าทายนี้มีคะแนน 200 แต้มสำหรับการตอบคำถามแรกและยังคงไม่แพ้ใครเป็นเวลาอย่างน้อย 3 วันโดยอ้างว่าuser3080953
เมื่อไม่นานมานี้มีการพูดคุยกันมากมายเกี่ยวกับการเข้ารหัสแบบครบวงจรและกดดันให้ บริษัท ต่างๆนำผลิตภัณฑ์ออกจากผลิตภัณฑ์ของตน ฉันไม่ได้สนใจในสิทธิและความผิดของสิ่งนั้น แต่ฉันสงสัยว่ารหัสสั้นแค่ไหนที่จะทำให้ บริษัท กดดันให้ไม่ใช้มัน
ความท้าทายที่นี่คือการใช้การแลกเปลี่ยนคีย์ Diffie Hellmanระหว่างสองระบบเครือข่ายจากนั้นอนุญาตให้ผู้ใช้สื่อสารกลับไปกลับมาโดยใช้คีย์สมมาตรที่สร้างขึ้น สำหรับวัตถุประสงค์ของงานนี้ไม่จำเป็นต้องมีการป้องกันอื่น ๆ (เช่นไม่จำเป็นต้องวนกุญแจตรวจสอบตัวตนป้องกัน DoS ฯลฯ ) และคุณสามารถใช้งานอินเทอร์เน็ตแบบเปิดได้ การใช้บิวอินได้รับอนุญาตและสนับสนุน!
คุณสามารถเลือกหนึ่งในสองรุ่น:
- เซิร์ฟเวอร์และไคลเอนต์: ไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์จากนั้นเซิร์ฟเวอร์หรือไคลเอนต์สามารถส่งข้อความไปยังอีก บุคคลที่สามในระหว่างทั้งสองจะต้องไม่สามารถอ่านข้อความได้ ตัวอย่างการไหลอาจเป็น:
- ผู้ใช้ A เปิดตัวเซิร์ฟเวอร์
- ผู้ใช้ B เปิดตัวไคลเอนต์และนำไปยังเซิร์ฟเวอร์ของผู้ใช้ A (ผ่านทาง IP / พอร์ต) โปรแกรมจะเปิดการเชื่อมต่อ
- โปรแกรมของผู้ใช้ A ยอมรับการเชื่อมต่อ (ขอความยินยอมจากผู้ใช้ก่อน)
- โปรแกรมของผู้ใช้ B เริ่มต้นการสร้างความลับ DH และส่งข้อมูลที่ต้องการ (กุญแจสาธารณะนายกตัวสร้างสิ่งอื่นใดที่คุณต้องนำไปใช้) กับผู้ใช้ A
- โปรแกรมของผู้ใช้ใช้ข้อมูลที่ส่งเพื่อสร้างความลับที่แชร์เสร็จสมบูรณ์และส่งข้อมูลที่ต้องการ (กุญแจสาธารณะ) กลับไปยังผู้ใช้ B จากจุดนี้ผู้ใช้ A สามารถป้อนข้อความ (เช่นผ่าน stdin) ซึ่งจะถูกเข้ารหัสและส่งไปยังผู้ใช้ B (เช่นเพื่อ stdout)
- โปรแกรมของผู้ใช้ B เสร็จสิ้นการสร้างความลับที่แชร์ จากจุดนี้ผู้ใช้ B สามารถส่งข้อความไปยังผู้ใช้ก
- หรือ: เซิร์ฟเวอร์ที่มีลูกค้าสองรายเชื่อมต่ออยู่: ลูกค้าแต่ละรายพูดคุยกับเซิร์ฟเวอร์ซึ่งส่งต่อข้อความไปยังลูกค้ารายอื่น เซิร์ฟเวอร์เอง (และบุคคลที่สามในระหว่างนั้น) จะต้องไม่สามารถอ่านข้อความได้ นอกเหนือจากการเชื่อมต่อเริ่มต้นกระบวนการจะเหมือนกับที่อธิบายไว้ในตัวเลือกแรก
กฎรายละเอียด:
- คุณสามารถจัดหาโปรแกรมเดี่ยวหรือหลายโปรแกรม (เช่นเซิร์ฟเวอร์และไคลเอนต์) คะแนนของคุณคือขนาดรหัสทั้งหมดของทุกโปรแกรม
- โปรแกรมของคุณจะต้องสามารถสื่อสารผ่านเครือข่ายในทางทฤษฎี (แต่สำหรับการทดสอบ localhost นั้นใช้ได้) หากภาษาที่คุณเลือกไม่รองรับเครือข่ายคุณสามารถรวมกับสิ่งที่ทำ (เช่นเชลล์สคริปต์) ในกรณีนี้คะแนนของคุณคือขนาดรหัสทั้งหมดในทุกภาษาที่ใช้
- การสร้างคีย์ Diffie Hellman สามารถใช้ค่า "p" และ "g" แบบตายตัวได้
- รหัสแชร์ที่สร้างขึ้นต้องมีอย่างน้อย 1024 บิต
- เมื่อใช้คีย์ร่วมกันตัวเลือกการเข้ารหัสคีย์สมมาตรนั้นขึ้นอยู่กับคุณ แต่คุณต้องไม่เลือกวิธีที่ทราบกันดีว่าในปัจจุบันมีการโจมตีในทางปฏิบัติ (เช่นการเปลี่ยนซีซาร์เป็นเรื่องเล็กน้อยที่จะย้อนกลับโดยปราศจากความรู้เกี่ยวกับกุญแจ ) ตัวอย่างอัลกอริทึมที่อนุญาต:
- AES (ขนาดใดก็ได้ที่สำคัญ)
- RC4 (แตกตามหลักทฤษฏี แต่ไม่มีการโจมตีเชิงปฏิบัติที่ฉันสามารถหากล่าวถึงได้ดังนั้นจึงอนุญาตได้ที่นี่)
- ผู้ใช้ A และ B ทั้งสองจะต้องสามารถส่งข้อความถึงกันและกัน (การสื่อสารสองทาง) แบบโต้ตอบ (เช่นการอ่านบรรทัดจาก stdin การแจ้งเตือนอย่างต่อเนื่องหรือเหตุการณ์เช่นการกดปุ่ม) หากทำได้ง่ายขึ้นคุณอาจสมมติการสนทนาสำรอง (เช่นหลังจากผู้ใช้ส่งข้อความพวกเขาต้องรอการตอบกลับก่อนส่งข้อความถัดไป)
- builtins ภาษาจะได้รับอนุญาต (ไม่จำเป็นต้องเขียนวิธีการเข้ารหัสลับหรือเครือข่ายของคุณเองหากพวกเขากำลังได้รับการสนับสนุนแล้ว)
- รูปแบบการสื่อสารพื้นฐานนั้นขึ้นอยู่กับคุณ
- ขั้นตอนการสื่อสารที่ระบุด้านบนเป็นตัวอย่าง แต่คุณไม่จำเป็นต้องปฏิบัติตาม (ตราบใดที่มีการแบ่งปันข้อมูลที่จำเป็นและไม่มีคนกลางสามารถคำนวณคีย์หรือข้อความที่แชร์ได้)
- หากไม่ทราบรายละเอียดที่จำเป็นในการเชื่อมต่อกับเซิร์ฟเวอร์ของคุณล่วงหน้า (เช่นหากฟังบนพอร์ตสุ่ม) รายละเอียดเหล่านี้จะต้องพิมพ์ออกมา คุณสามารถสันนิษฐานได้ว่าที่อยู่ IP ของเครื่องเป็นที่รู้จัก
- การจัดการข้อผิดพลาด (เช่นที่อยู่ไม่ถูกต้องการเชื่อมต่อที่หายไป ฯลฯ ) ไม่จำเป็น
- ความท้าทายคือการเขียนโค้ดดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
p
และg
อนุญาตเป็นอย่างไร