GolfScript 60 ตัวอักษร
{[[0 1{.283{1$2*.255>@*^}:r~^}255*].@?~)={257r}4*99]{^}*}:S;
รหัสนี้กำหนดฟังก์ชั่นที่มีชื่อS
เป็นไบต์และใช้ Rijndael S-box กับมัน (นอกจากนี้ยังใช้ฟังก์ชันตัวช่วยภายในที่ตั้งชื่อr
เพื่อบันทึกตัวอักษรสองสามตัว)
การใช้งานนี้ใช้ตารางลอการิทึมเพื่อคำนวณค่าผกผันGF (2 8 ) ตามที่ Thomas Porninแนะนำ หากต้องการบันทึกสองสามตัวตารางลอการิทึมทั้งหมดจะถูกคำนวณใหม่สำหรับแต่ละไบต์อินพุต ถึงอย่างนั้นและถึงแม้ว่า GolfScript จะเป็นภาษาที่ช้ามากโดยทั่วไปรหัสนี้ใช้เวลาเพียง 10 ms ในการประมวลผลไบต์บนแล็ปท็อปเครื่องเก่าของฉัน การประมาณค่าตารางลอการิทึม (ตามL
) จะเพิ่มความเร็วได้สูงถึงประมาณ 0.5 มิลลิวินาทีต่อไบต์ด้วยค่าใช้จ่ายที่น้อยกว่าสามตัวอักษร:
[0 1{.283{1$2*.255>@*^}:r~^}255*]:L;{[L?~)L={257r}4*99]{^}*}:S;
เพื่อความสะดวกนี่คือสายรัดทดสอบแบบง่ายที่เรียกใช้ฟังก์ชั่นS
ตามที่นิยามไว้ข้างต้นเพื่อคำนวณและพิมพ์ S-box ทั้งหมดในรูปหกเหลี่ยมเช่นเดียวกับใน Wikipedia :
"0123456789abcdef"1/:h; 256, {S .16/h= \16%h= " "++ }% 16/ n*
ลองใช้รหัสนี้ทางออนไลน์
(การสาธิตออนไลน์จะคำนวณตารางลอการิทึมล่วงหน้าเพื่อหลีกเลี่ยงการใช้เวลามากเกินไปถึงกระนั้นเว็บไซต์ GolfScript ออนไลน์บางครั้งก็อาจจะหมดเวลาแบบสุ่มนี่เป็นปัญหาที่ทราบกันดีของไซต์และการโหลดซ้ำมักแก้ไขได้)
คำอธิบาย:
เริ่มจากการคำนวณตารางลอการิทึมและโดยเฉพาะกับฟังก์ชันตัวช่วยr
:
{1$2*.255>@*^}:r
ฟังก์ชันนี้ใช้สองอินพุตในสแต็ก: ไบต์และบิตมัสค์ลด (ค่าคงที่ระหว่าง 256 และ 511) มันทำซ้ำอินพุตไบต์คูณสำเนาด้วย 2 และหากผลลัพธ์เกิน 255 XOR จะใช้ bitmask เพื่อนำกลับมาต่ำกว่า 256
ภายในโค้ดสร้างตารางบันทึกฟังก์ชันr
จะถูกเรียกใช้พร้อมกับการลด bitmask 283 = 0x11b (ซึ่งสอดคล้องกับRijndael GF (2 8 ) การลดพหุนาม x 8 + x 4 + x 3 + x + 1) และผลลัพธ์คือ XORed กับไบต์ดั้งเดิมคูณได้อย่างมีประสิทธิภาพด้วย 3 (= x + 1, เป็นพหุนาม) ในเขตข้อมูล Rijndael การคูณนี้ทำซ้ำ 255 ครั้งเริ่มจากไบต์ 1 และผลลัพธ์ (บวกศูนย์เริ่มต้นไบต์) จะถูกรวบรวมลงในอาร์เรย์องค์ประกอบ 257 L
ที่มีลักษณะเช่นนี้ (ละเว้นส่วนตรงกลาง):
[0 1 3 5 15 17 51 85 255 26 46 ... 180 199 82 246 1]
เหตุผลที่มี 257 องค์ประกอบคือด้วย 0 ที่ได้รับการเติมและมี 1 เกิดขึ้นสองครั้งเราสามารถหาค่าผกผันแบบแยกส่วนของไบต์ที่กำหนดได้ง่ายๆโดยค้นหาดัชนี (zero-based) ในอาเรย์นี้ลบมันและมองหา ขึ้นไบต์ที่ดัชนีเมื่อตะกี้ในอาร์เรย์เดียวกัน (ใน GolfScript เช่นเดียวกับในภาษาการเขียนโปรแกรมอื่น ๆ ดัชนีอาเรย์เชิงลบจะนับถอยหลังจากจุดสิ้นสุดของอาเรย์) แน่นอนว่านี่คือสิ่งที่รหัสL?~)L=
ที่จุดเริ่มต้นของฟังก์ชั่นS
ทำ
ส่วนที่เหลือของรหัสเรียกฟังก์ชั่นผู้ช่วยr
สี่ครั้งด้วยการลด bitmask 257 = 2 8 + 1 เพื่อสร้างสำเนาแบบหมุนสี่บิตของไบต์อินพุตแบบ inverted สิ่งเหล่านี้ถูกรวบรวมไว้ในอาร์เรย์พร้อมกับค่าคงที่ 99 = 0x63 และ XORed ร่วมกันเพื่อสร้างผลลัพธ์สุดท้าย