พื้นหลัง
แผ่นเพียงครั้งเดียวเป็นรูปแบบของการเข้ารหัสที่พิสูจน์แล้วว่าเป็นไปไม่ได้ที่จะถอดรหัสหากใช้อย่างเหมาะสม
การเข้ารหัสจะดำเนินการโดยใช้ข้อความธรรมดา (ประกอบด้วยตัวอักษร AZ เท่านั้น) และสร้างสตริงแบบสุ่มที่ความยาวเท่ากัน (รวมถึงตัวอักษรเท่านั้น) สายนี้ทำหน้าที่เป็นกุญแจสำคัญ อักขระแต่ละตัวในข้อความธรรมดาจะถูกจับคู่กับอักขระที่สอดคล้องกันในคีย์ ciphertext ถูกคำนวณดังนี้: สำหรับแต่ละคู่อักขระทั้งสองจะถูกแปลงเป็นตัวเลข (A = 0, B = 1, ... Z = 25) ตัวเลขทั้งสองจะถูกเพิ่มแบบโมดูโล 26 หมายเลขนี้คือการแปลงกลับไปเป็นตัวละคร
การถอดรหัสเป็นสิ่งที่ตรงกันข้าม อักขระใน ciphertext และคีย์ถูกจับคู่และแปลงเป็นตัวเลข คีย์จะถูกลบออกจาก ciphertext modulo 26 และผลลัพธ์จะถูกแปลงกลับไปเป็นอักขระ AZ
ความท้าทาย
ความท้าทายของคุณคือการเขียนโปรแกรมที่สั้นที่สุดที่สามารถเข้ารหัสและถอดรหัสแผ่นเพียงครั้งเดียว
ในบรรทัดแรกของอินพุต (ถึง STDIN) จะมีคำว่า "ENCRYPT" หรือคำว่า "DECRYPT"
หากคำนั้นถูกเข้ารหัสแล้วบรรทัดถัดไปจะเป็นข้อความธรรมดา โปรแกรมของคุณควรเอาต์พุตสองบรรทัด (ไปยัง STDOUT), อันแรกคือกุญแจ, และอันที่สองคือ ciphertext
หากคำนั้นถอดรหัสโปรแกรมของคุณจะได้รับสองบรรทัดเพิ่มเติม บรรทัดแรกจะเป็นคีย์และบรรทัดที่สองจะเป็นไซเฟอร์เท็กซ์ คุณควรโปรแกรมออกหนึ่งบรรทัดซึ่งจะเป็นข้อความธรรมดาที่ได้รับการถอดรหัส
ข้อความธรรมดา, ไซเฟอร์เท็กซ์และคีย์ควรประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่ AZ เสมอ พวกเขาจะเป็นบรรทัดเดียวเสมอและไม่มีช่องว่าง
ที่สำคัญควรเป็นแบบสุ่ม ไม่มีส่วนใหญ่ที่ควรทำซ้ำระหว่างการวิ่งและไม่ควรมีรูปแบบที่สามารถพบได้ในข้อความ
ตัวอย่างง่ายๆสองตัวอย่าง:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
>
หมายถึงเส้นที่มีการส่งออกเพื่อให้คุณไม่ต้องพิมพ์สัญลักษณ์ที่เป็นผลผลิต
/dev/random
, haveged
), เข้ารหัสโดย xoring the ords ด้วยไบต์และถอดรหัสโดย xoring พวกเขาด้วยกุญแจ gist.github.com/5078264กุญแจหรือการสุ่มสามารถอ่านได้จาก stdin ข้อความหรือข้อความไซเฟอร์เท็กซ์อาจเป็นอาร์กิวเมนต์ชื่อไฟล์
/dev/hwrng
แทนที่จะใช้หลอกสุ่ม (ซึ่งทำให้เทคนิคแตก)