คุณเคยได้ยินเกี่ยวกับ รหัสซีซาร์ . หรือไม่ ?
Julius Caesar ใช้เทคนิคนี้เพื่อปกปิดข้อความลับจากศัตรูของเขา!
รหัสซีซาร์เป็นหนึ่งในเทคนิคการเข้ารหัสดั้งเดิมที่สุด
แนวคิดหลักที่อยู่เบื้องหลังระบบนี้คือ หมุนตัวอักษร ตำแหน่งตัวอักษร x จำนวน .
ตัวอย่างเช่น ด้วย x = 1
, 'A' กลายเป็น 'B', 'C' กลายเป็น 'D' เป็นต้น
เราจะนำสิ่งนี้ไปใช้ในโค้ดได้อย่างไร
ดีใจที่คุณถาม ปรากฎว่ามันไม่ยากอย่างที่คิด เราจะใช้ประโยชน์จากข้อเท็จจริงที่ว่าตัวอักษรสามารถแสดงด้วยตัวเลขได้ (รหัส ASCII) ซึ่งจะทำให้การหมุนเวียนตัวอักษรเป็นเรื่องของการบวกตัวเลขสองตัวเข้าด้วยกัน
สร้างเครื่องแปลงรหัสซีซาร์ของคุณเอง
เราจะเริ่มต้นด้วยการแปลงสตริงอินพุตเป็นอาร์เรย์จำนวนเต็ม:
ascii = "test".chars.map(&:ord)
มาทำลายสิ่งนี้กันเถอะ :
อักขระ วิธีแบ่งสตริงออกเป็นอาร์เรย์ของอักขระและส่งคืนตัวแจงนับ เป็นผลให้เราสามารถเรียกแผนที่ บนอาร์เรย์
เมธอดแผนที่มีประโยชน์มากเมื่อเราต้องการแปลงองค์ประกอบทั้งหมดของอาร์เรย์ด้วยวิธีใดวิธีหนึ่ง ค่าส่งคืนของ map เป็นอาร์เรย์อื่นที่มีองค์ประกอบที่แปลงแล้ว
หมายเหตุ:ไวยากรณ์นี้ต้องใช้ Ruby 1.9+ และเทียบเท่ากับ:
ascii = "test".chars.map { |c| c.ord }
เนื่องจากเราต้องการเปลี่ยนตัวอักษรทุกตัวให้เป็นค่า ASCII ที่สอดคล้องกัน เราจึงเรียก ord เมธอดในทุกองค์ประกอบของอาร์เรย์
ในตัวอย่างของเรา ผลลัพธ์จะเป็นดังนี้:
[116, 101, 115, 116]
เวลาในการหมุน
เยี่ยมมาก!
ขั้นตอนต่อไปคือการเพิ่มจำนวนการหมุนที่เราต้องการ เราทำได้โดยใช้ แผนที่ อีกครั้ง:
shifted = ascii.map { |c| c + 5 } => [121, 106, 120, 121]
ตอนนี้เราสามารถเปลี่ยนตัวเลขกลับเป็นตัวอักษร แล้วรวมเข้าด้วยกันซึ่งจะทำให้สตริงที่เข้ารหัสแก่เรา:
shifted.map { |c| c.chr }.join => "yjxy"
ในการดึงสตริงเดิมของเรา ทั้งหมดที่เราต้องทำคือใช้ขั้นตอนเดิมอีกครั้ง แต่คราวนี้เลื่อนไปทางซ้าย
สิ่งสำคัญคือต้องเปลี่ยนตามจำนวนตำแหน่งที่เราใช้เดิม มิฉะนั้น เราจะไม่กู้คืนข้อมูลเดิมของเรา
โค้ดสุดท้ายและเวอร์ชันทางเลือก
คุณสามารถหารหัสซีซาร์ที่เสร็จแล้วได้ที่นี่
มันสร้างการวนซ้ำที่เป็นไปได้ทั้งหมด 26 ครั้งสำหรับสตริงที่กำหนดและยังจัดการการตัดคำด้วย (ตัวอย่างในโพสต์ไม่ทำ)
นอกจากนี้ยังมีเวอร์ชันอื่นที่ใช้ Array#rotate
คุณอาจชอบ:
การจัดรูปแบบสตริงทับทิม