ด้วยจิตวิญญาณของการประกวด C ที่มีเล่ห์เหลี่ยม วัตถุประสงค์ของการประกวดครั้งนี้คือการนำโค้ดไปใช้อย่างตรงไปตรงมาในขณะที่ซ่อนจุดบกพร่องที่ซ่อนอยู่ในนั้นไว้อย่างละเอียด
การแข่งขัน
คุณเป็นโมลรัสเซียที่ทำงานในแผนก IT ของ บริษัท สายลับอเมริกัน เจ้านายชาวอเมริกันของคุณเพิ่งขอให้คุณใช้อัลกอริทึมการแฮชรหัสผ่านเพื่อใช้สำหรับการเข้ารหัสข้อความลับ
เจ้านายของคุณต้องการให้คุณใช้งานฟังก์ชั่นต่อไปนี้:
f: String -> byte[16]
ซึ่งแปลงรหัสผ่านเป็นปริมาณ 16 ไบต์ที่เหมาะสมสำหรับใช้เป็นคีย์ AES เจ้านายของคุณต้องการฟังก์ชั่นที่ปลอดภัยซึ่งในบริบทนี้หมายความว่าสตริงรหัสผ่านที่แตกต่างกันควรสร้างผลลัพธ์ที่แตกต่างพร้อมความน่าจะเป็นอย่างมาก ยกตัวอย่างเช่นกลับmd5f
กัญชาของท่านจะเป็นการดำเนินงานที่เรียบง่ายของ
แน่นอนว่าหัวหน้าที่แท้จริงของคุณในสายลับรัสเซียต้องการให้คุณล้มล้างกระบวนการนี้ งานของคุณคือการดำเนินการดังกล่าวว่ารัสเซียสามารถถอดรหัสทุกข้อความลับเข้ารหัสโดยใช้ปุ่มส่งกลับโดยf
f
ในการทำเช่นนั้นคุณต้องดำเนินการf
เพื่อที่จะส่งคืนชุดย่อยขนาดเล็กของเอาต์พุตที่เป็นไปได้ 2 ^ 128 เท่านั้น โดยเฉพาะอย่างยิ่งคุณf
จะต้องส่งกลับผลลัพธ์ที่ต่างกันมากที่สุด 2 ^ 16 เพื่อให้รัสเซียสามารถค้นหาคีย์ที่ถูกต้องสำหรับข้อความที่เข้ารหัสแต่ละข้อความที่พวกเขาต้องการถอดรหัสได้อย่างง่ายดาย
อย่างไรก็ตามโปรดจำไว้ว่าการจารกรรมถือโทษประหารชีวิต เพื่อไม่ให้ถูกจับได้ฟังก์ชันของคุณf
จะต้องสร้างผลลัพธ์ที่แตกต่างกันอย่างน้อย 2 ^ 8 ดังนั้นการตรวจสอบคร่าวๆของเอาต์พุตไม่กี่รายการf
จึงไม่น่าจะเปิดเผยสิ่งที่ซ้ำกัน และที่สำคัญที่สุดรหัสที่คุณแนะนำเพื่อ จำกัด ช่วงของf
ต้องดูโดยไม่ได้ตั้งใจไม่ได้ตั้งใจ หากคุณถูกลากเข้าไปในห้องพิจารณาคดีต้องมีข้อสงสัยที่สมเหตุสมผลว่าคุณแนะนำข้อผิดพลาดโดยเจตนาหรือโดยอุบัติเหตุ
การตัดสิน
ฉันและอีกสองคนที่ฉันรับสมัครจะเป็นผู้ตัดสินผลงาน (ส่งอีเมลถึงฉันหากคุณต้องการตัดสิน) ฉันเสนอรางวัล 200 ชื่อเสียงให้กับผู้ชนะ ส่งจะต้องอัปโหลดภายในวันที่ 1 พฤษภาคม
การตัดสินจะพิจารณาเกณฑ์ต่อไปนี้:
- ไม่
f
ไปตามสเปคคือไม่ได้สร้างระหว่าง 2 ^ 8 และ 2 ^ 16 ผลที่เป็นไปได้ อย่ารู้สึกว่าสิ่งเหล่านี้มีข้อ จำกัด อย่างหนัก แต่เราจะหักคะแนนถ้าคุณอยู่ไกลเกินไป - ข้อผิดพลาดนั้นเป็นผลมาจากความผิดพลาดโดยไม่ตั้งใจหรือไม่?
- ผลลัพธ์ของการ
f
สุ่มดูหรือไม่ - ยิ่งการใช้งานของคุณสั้นลงเท่าไหร่
f
ก็ยิ่งดีเท่านั้น - ยิ่งการดำเนินการของคุณชัดเจนยิ่ง
f
ขึ้น
หมายเหตุ
คุณสามารถใช้ภาษาใดก็ได้เพื่อใช้รหัสของคุณ คุณกำลังพยายามซ่อนจุดบกพร่องในสายตาธรรมดาดังนั้นไม่แนะนำให้ใช้รหัสที่ทำให้งงงวย
คุณอาจต้องการดูผู้ชนะการประกวด Underhanded Cก่อนหน้านี้บางคนเพื่อทำความเข้าใจกับสิ่งที่ส่งผลดี
สตริงอินพุตจะพิมพ์ได้ ascii (32 ถึง 126, รวม) คุณอาจใช้ความยาวสูงสุดที่เหมาะสมถ้าคุณต้องการ